gpt4 book ai didi

c# - Entity Framework 和多个模式

转载 作者:可可西里 更新时间:2023-11-01 03:10:03 25 4
gpt4 key购买 nike

我正在尝试设置我的 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。它引用的值是 _schema1 中的 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 来工作,但它只使用一个连接(这是我不想使用多个 dbContext 的原因)。设置以下代码后:

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())
}
}

关于c# - Entity Framework 和多个模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14902245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com