sql >> Databáze >  >> RDS >> Oracle

Entity Framework a více schémat

Při průzkumu Entity Framework jsem narazil na následující příspěvek:

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

Nedává mi to úplně jediný dbContext, se kterým bych mohl pracovat, ale používá to pouze jedno připojení (což byla moje úvaha, že nechci používat více dbContexts). Po nastavení následujícího kódu:

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

To samozřejmě vyžaduje, aby moje mapovací soubory byly nastaveny takto:

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

        //Map other properties and stuff
    }
}

Psaní dotazů, které používají více schémat, je poněkud otravné, ale v tuto chvíli dělá to, co potřebuji:

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. Tipy pro vzdálenou správu PostgreSQL

  2. Přehled funkce DBCC CheckDB

  3. Nejlepší nástroje s otevřeným zdrojovým kódem pro migrace PostgreSQL

  4. Práce s událostmi v Oracle Cloud Infrastructure Část 1:Základy služeb