एंटिटी फ्रेमवर्क के बारे में कुछ शोध करते समय मुझे निम्नलिखित पोस्ट का पता चला:
http://romiller.com/2011/05/23/ef-4-1-multi-tenant-with-code-first/
यह मुझे काम करने के लिए एक एकल डीबीकॉन्टेक्स्ट नहीं देता है लेकिन यह केवल एक कनेक्शन का उपयोग करता है (जो एकाधिक डीबीकॉन्टेक्स्ट का उपयोग नहीं करना चाहता था)। निम्नलिखित कोड सेट करने के बाद:
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())
}
}