[英]Entity Framework and multiple schemas
我正在嘗試設置我的dbContext,以便它可以在單個Oracle數據庫中處理多個模式。 我不想要一個單片dbContext文件,所以我想出了以下內容:
public class oraDbContext : DbContext
{
static oraDbContext() {
Database.SetInitializer<oraDbContext>(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> 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進行一些研究時,我遇到了以下帖子:
http://romiller.com/2011/05/23/ef-4-1-multi-tenant-with-code-first/
它並沒有給我一個單獨的dbContext,但它只使用一個連接(這是我不想使用多個dbContexts的原因)。 設置以下代碼后:
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())
}
}
請嘗試使用部分類
public partial class oraDbContext : DbContext
{
static oraDbContext() {
Database.SetInitializer<oraDbContext>(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> 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 { }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.