Trong khi thực hiện một số nghiên cứu về Khung thực thể, tôi đã xem bài đăng sau:
http://romiller.com/2011/05/23/ef-4-1-multi-tenant-with-code-first/
Nó không hoàn toàn cung cấp cho tôi một dbContext duy nhất để làm việc nhưng nó chỉ sử dụng một kết nối duy nhất (đó là lý do của tôi đằng sau việc không muốn sử dụng nhiều dbContexts). Sau khi thiết lập mã sau:
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);
}
}
Tất nhiên, điều này yêu cầu các tệp ánh xạ của tôi phải được thiết lập như vậy:
public class DailyDependencyTableMap : EntityTypeConfiguration<DailyDependencyTable>
{
public SomeTableMap(string schemaName) {
this.ToTable("SOME_TABLE_1", schemaName.ToUpper());
//Map other properties and stuff
}
}
Viết truy vấn sử dụng nhiều lược đồ hơi khó chịu nhưng hiện tại, nó thực hiện những gì tôi cần:
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())
}
}