entity framework和多个模式

我正在尝试设置我的dbContext,以便它可以在单个Oracle数据库中处理多个模式。 我不想要一个单片dbContext文件,所以我想出了以下内容:

public class oraDbContext : DbContext { static oraDbContext() { Database.SetInitializer(null); } public oraDbContext(string connName) : base("Name=" + connName) { } public _schema1 schema1 = _schema1.Instance; public _schema2 schema2 = _schema2.Instance; protected override void OnModelCreating(DbModelBuilder modelBuilder) { schema1.OnModelCreating(modelBuilder); schema2.OnModelCreating(modelBuilder); } } 

模式文件如下所示:

 public sealed class _schema1 { private static readonly _schema1 instance = new _schema1(); static _schema1() { } private _schema1() { } public static _schema1 Instance { get { return instance; } } public DbSet someTable { get; set; } internal void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new someTableMap()); } } 

但是,当我尝试执行查询时,我收到错误: Value cannot be null 。 它引用的值是someTable中的someTable属性。

A.我该如何解决这个问题?

B.有更好的解决方案吗?

编辑:我想要的是能够编写如下代码 –

 var query1 = from p in db.schema1.someTable select p; var query2 = from p in db.schema2.someTable select p; 

其中someTable在两个模式中都是相同的。 在我们的数据库中,我们有几个模式具有完全相同的表,这些表具有相同或几乎相同的列。 我不想为每个模式创建一个单独的dbContext,因为如果我创建一个从5个模式中提取的查询,那么这可能意味着5个不同的连接。 如果我在直接SQL中编写相同的查询,我可以通过单个连接从5个不同的模式中提取数据,这就是我想在这里完成的。

在对Entity Framework进行一些研究时,我遇到了以下post:

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

它并没有给我一个单独的dbContext,但它只使用一个连接(这是我不想使用多个dbContexts的原因)。 设置以下代码后:

 public class oraDbContext : DbContext { static oraDbContext() { Database.SetInitializer(null); } private oraDbContext(DbConnection connection, DbCompiledModel model) : base(connection, model, contextOwnsConnection: false) { } public DbSet SomeTable1 { get; set; } public DbSet SomeTable2 { get; set; } private static ConcurrentDictionary, DbCompiledModel> modelCache = new ConcurrentDictionary, 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(new SomeTable1Map(schemaName)); builder.Configurations.Add(new SomeTable2Map(schemaName)); var model = builder.Build(connection); return model.Compile(); }); return new oraDbContext(connection, compiledModel); } } 

这当然要求我的映射文件设置如下:

 public class DailyDependencyTableMap : EntityTypeConfiguration { 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()) } } 

请尝试使用部分类

 public partial class oraDbContext : DbContext { static oraDbContext() { Database.SetInitializer(null); } public oraDbContext(string connName) : base("Name=" + connName) { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { schema1(modelBuilder); schema2(modelBuilder); } } public partial class oraDbContext : DbContext { public DbSet someTable { get; set; } void schema1(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new someTableMap()); } } 

您可以通过Table属性为每个表指定模式。

 [Table(nameof(MyTable1), Schema = "Schema1")] public class MyTable1 { } [Table(nameof(MyTable2), Schema = "Schema2")] public class MyTable2 { }