Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Entity Framework i wiele schematów

Podczas wyszukiwania informacji na temat Entity Framework natknąłem się na następujący post:

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

Nie daje mi jednego dbContext do pracy, ale używa tylko jednego połączenia (co było moim powodem, dla którego nie chciałem używać wielu dbContexts). Po skonfigurowaniu następującego kodu:

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 oczywiście wymaga, aby moje pliki mapowania były skonfigurowane w następujący sposób:

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

        //Map other properties and stuff
    }
}

Pisanie zapytań, które używają wielu schematów, jest nieco denerwujące, ale na razie robi to, czego od niego potrzebuję:

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. Tablica w klauzuli IN() oracle PLSQL

  2. Oracle 12.2.0.1 już w 2016 r.

  3. Jak zamawiać według daty w PostgreSQL lub Oracle

  4. Należy zadeklarować identyfikator PLS-00201 'PACKAGENAME.PROCEDURENAME'

  5. Jak obliczyć średnią kolumny, a następnie uwzględnić ją w zapytaniu wybierającym w Oracle?