Oracle
 sql >> база данни >  >> RDS >> Oracle

Entity Framework и множество схеми

Докато правех някои проучвания за Entity Framework, попаднах на следната публикация:

http://romiller.com/2011/05/23/ef-4-1-multi-tenant-with-code-first/

Не ми дава нито един dbContext, с който да работя, но използва само една връзка (което беше моята причина да не искам да използвам множество dbContexts). След настройка на следния код:

public class oraDbContext : DbContext
{
    static oraDbContext() {
        Database.SetInitializer<oraDbContext>(null);
    }

    private oraDbContext(DbConnection connection, DbCompiledModel model)
        : base(connection, model, contextOwnsConnection: false) { }

    public DbSet<SomeTable1> SomeTable1 { get; set; }
    public DbSet<SomeTable2> SomeTable2 { get; set; }

    private static ConcurrentDictionary<Tuple<string, string>, DbCompiledModel> modelCache = new ConcurrentDictionary<Tuple<string, string>, DbCompiledModel>();

    public static oraDbContext Create(string schemaName, DbConnection connection) {
        var compiledModel = modelCache.GetOrAdd(
            Tuple.Create(connection.ConnectionString, schemaName),
            t =>
            {
                var builder = new DbModelBuilder();
                builder.Configurations.Add<SomeTable1>(new SomeTable1Map(schemaName));
                builder.Configurations.Add<SomeTable2>(new SomeTable2Map(schemaName));

                var model = builder.Build(connection);
                return model.Compile();
            });

        return new oraDbContext(connection, compiledModel);
    }
}

Това, разбира се, изисква моите картографски файлове да бъдат настроени така:

public class DailyDependencyTableMap : EntityTypeConfiguration<DailyDependencyTable>
{
    public SomeTableMap(string schemaName) {
        this.ToTable("SOME_TABLE_1", schemaName.ToUpper());

        //Map other properties and stuff
    }
}

Писането на заявки, които използват множество схеми, е донякъде досадно, но за момента прави това, което ми трябва:

using (var connection = new OracleConnection("a connection string")) {
    using (var schema1 = oraDbContext.Create("SCHEMA1", connection))
    using (var schema2 = oraDbContext.Create("SCHEMA2", connection)) {

        var query = ((from a in schema1.SomeTable1 select new { a.Field1 }).ToList())
             .Concat((from b in schema2.SomeTable1 select new { b.Field1 }).ToList())
    }
}



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL множество колони в IN клауза

  2. ЗАРЕЖДАНЕ НА ДАННИ INFILE еквивалент в Oracle

  3. предаване на името на таблицата като параметър на plsql

  4. Как да предадете параметър със стойност на таблица от C# към запаметена процедура на Oracle

  5. Как да покажа всички привилегии на база данни на Oracle за потребител