简体   繁体   English

实体框架和多个模式

[英]Entity Framework and multiple schemas

I'm trying to set up my dbContext so that it can handle multiple schemas in a single Oracle database. 我正在尝试设置我的dbContext,以便它可以在单个Oracle数据库中处理多个模式。 I didn't want one monolithic dbContext file so I've come up with the following: 我不想要一个单片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);
    }
}

The schema file looks like this: 模式文件如下所示:

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

However, when I try to perform a query I get the error: Value cannot be null . 但是,当我尝试执行查询时,我收到错误: Value cannot be null The value it's referring to is the someTable property in _schema1. 它引用的值是someTable中的someTable属性。

A. How can I fix this? A.我该如何解决这个问题?

B. Is there a better solution? B.有更好的解决方案吗?

Edit: What I want here is the ability to write code such as the following - 编辑:我想要的是能够编写如下代码 -

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

Where someTable is the same in both schemas. 其中someTable在两个模式中都是相同的。 In our database we have several schemas with the exact same tables that have identical or nearly identical columns. 在我们的数据库中,我们有几个模式具有完全相同的表,这些表具有相同或几乎相同的列。 I don't want to create a seperate dbContext for each schema because that could potentially mean 5 different connections if I'm creating a query that pulls from 5 schemas. 我不想为每个模式创建一个单独的dbContext,因为如果我创建一个从5个模式中提取的查询,这可能意味着5个不同的连接。 If I was writing this same query in straight SQL I could pull the data from 5 different schemas with a single connection and that's what I would like to accomplish here. 如果我在直接SQL中编写相同的查询,我可以通过单个连接从5个不同的模式中提取数据,这就是我想在这里完成的。

While doing some research about Entity Framework I came across the following post: 在对Entity Framework进行一些研究时,我遇到了以下帖子:

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

It doesn't quite give me a single dbContext to work with but it does only use a single connection (which was my reasoning behind not wanting to use multiple dbContexts). 它并没有给我一个单独的dbContext,但它只使用一个连接(这是我不想使用多个dbContexts的原因)。 After setting up the following code: 设置以下代码后:

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

This of course requires that my mapping files be set up like so: 这当然要求我的映射文件设置如下:

public class DailyDependencyTableMap : EntityTypeConfiguration<DailyDependencyTable>
{
    public SomeTableMap(string schemaName) {
        this.ToTable("SOME_TABLE_1", schemaName.ToUpper());

        //Map other properties and stuff
    }
}

Writing queries that use multiple schemas is somewhat annoying but, for the moment, it does what I need it to do: 编写使用多个模式的查询有点令人讨厌,但目前,它完成了我需要它做的事情:

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

Try using partial classes instead 请尝试使用部分类

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

You can specify schema per table via Table attribute. 您可以通过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.

相关问题 实体框架具有多个MySql模式的多个DbContext - Entity Framework Multiple DbContexts With Multiple MySql Schemas 实体框架和在单个上下文中具有多个模式的迁移 - Entity Framework and Migration with multiple schemas in a single Context Entity Framework 4 从具有多个模式的模型生成数据库 - Entity Framework 4 Generate Database From Model With Multiple Schemas 使用单个Entity Framework Core DbContext来管理具有同名表的多个数据库模式 - Using a single Entity Framework Core DbContext to manage multiple database schemas with homonymous tables C# Entity Framework 6 - 如何处理具有相同表名的多个模式 - C# Entity Framework 6 - How to handle multiple schemas that have same table names 具有两个数据库的实体框架(完全不同的架构) - entity framework with two databases (completely different schemas ) 首先在不同架构中映射具有相同表的实体 Entity Framework 6 代码 - Map entity with same table in different schemas Entity Framework 6 code first 不同 DbContext 和不同模式之间的实体框架关系 - Entity Framework relationships between different DbContext and different schemas 实体框架:两种数据库模式,一种没有数据库上下文 - Entity Framework : two database schemas, one without db context 在实体框架C#中将表实体分配给具有相同架构的另一个表实体 - Assign Table Entity to another Table Entity with identical schemas in Entity Framework C#
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM