【问题标题】:Multiple DbContexts on one DB with Code First Migrations具有代码优先迁移的一个数据库上的多个 DbContext
【发布时间】:2013-06-22 00:17:57
【问题描述】:

我偶然发现了与this question 中描述的相同的问题。此外,我不想从数据库中丢失 __migrationHistory 表。

我尝试了使用包含所有 DbSets 的“超级”上下文并使用普通上下文的建议解决方案,但出现错误。 (“模型支持 DbContext 已更改”) 如果您只是从 SQL 服务器中删除 __migrationHistory 表,这很容易避免,但正如我所说,我想保留历史记录。

我找到了一个简单易行的解决方案,请看下面我的回答。

【问题讨论】:

    标签: c# entity-framework ef-code-first entity-framework-migrations


    【解决方案1】:

    首先,您必须为迁移配置创建一个“超级”上下文。

    MySuperContext : DbContext
    {
        // All DbSet<> s from your different contexts have to be referenced here once, you will only use this class for the migrations.
    
        public MySuperContext() : base("YourConnectionString")
        {
            System.Data.Entity.Database.SetInitializer(new MigrateDatabaseToLatestVersion<MySuperContext, MyMigrationsConfiguration>());
        }
    }
    

    然后只需创建以下类:

    public class NoDatabaseInitializer<T> : IDatabaseInitializer<T> where T: DbContext
    {
        public void InitializeDatabase(T context)
        {
            // Do nothing, thats the sense of it!
        }
    }
    

    现在,在您拥有的每个小上下文中,将其添加到构造函数中:

    class MyUserContext : DbContext
    {
        public MyUserContext : base("MyConnectionString") // Can be a user context, etc
        {
            System.Data.Entity.Database.SetInitializer(new NoDatabaseInitializer<MyContext>());
        }
    }
    

    现在您不会再收到此错误了,
    另外,您将拥有您的迁移历史,
    您将在一个数据库上使用多个上下文。

    【讨论】:

    • 与以下内容有什么不同吗? Database.SetInitializer(null);
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 2014-04-09
      • 2012-02-25
      • 2012-05-13
      • 1970-01-01
      相关资源
      最近更新 更多