具有代码优先迁移的一个DB上的多个DbContexts

时间:2013-06-22 00:17:58

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

我偶然发现this question中描述的问题。另外,我不想从数据库中删除__migrationHistory表。

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

我找到了一个简单易用的解决方案,请参阅下面的答案。

2 个答案:

答案 0 :(得分:4)

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

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

现在你不会再出现这个错误了 另外,你将有你的移民历史,
并且您将在一个数据库上使用多个上下文。

答案 1 :(得分:2)