sql >> Database teknologi >  >> RDS >> Oracle

Entity Framework og flere skemaer

Mens jeg forskede lidt om Entity Framework stødte jeg på følgende indlæg:

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

Det giver mig ikke helt en enkelt dbContext at arbejde med, men det bruger kun en enkelt forbindelse (hvilket var min begrundelse for ikke at ville bruge flere dbContexts). Efter opsætning af følgende kode:

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);
    }
}

Dette kræver selvfølgelig, at mine mapping-filer er sat op sådan:

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

        //Map other properties and stuff
    }
}

At skrive forespørgsler, der bruger flere skemaer er noget irriterende, men i øjeblikket gør det, hvad jeg har brug for det:

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. Vent Begivenhed:Ændring af størrelse på asynkronbeskrivelse

  2. Sammenføjning af forskellige datakilder i lagdeling

  3. Sådan får du alle mulige kombinationer af rækker fra to tabeller i SQL

  4. Oracle Database Security – Kryptering og dekryptering