使用Code First Migrations在一个数据库上使用多个DbContexts

3
我遇到了与这个问题中描述的相同的问题,涉及到it技术。此外,我不希望从数据库中删除__migrationHistory表。
我尝试使用提供的解决方案,使用一个包含所有DbSet<>的“超级”上下文,并使用正常的上下文,但是我遇到了错误。(“Model backing DbContext has been changed”)如果您只是从SQL服务器中删除__migrationHistory表,这很容易避免,但是如我所说,我想保留历史记录。
我发现了一种简单而易用的解决方法,请参见我的答案。
2个回答

5
首先,您需要为迁移配置创建一个“超级”上下文。
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>());
    }
}

现在你将不再遇到这个错误,
此外,你将拥有你的迁移历史记录,
并且你将在一个数据库上使用多个上下文。


2
这有什么不同,与仅仅执行以下代码吗? Database.SetInitializer<MyContext>(null); - Thiago Silva

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接