在一个数据库上使用代码优先迁移的多个dbcontext

本文关键字:代码 迁移 dbcontext 一个 数据库 | 更新日期: 2023-09-27 18:19:22

我偶然发现了这个问题中描述的相同问题。另外,我不想从数据库中丢失__migrationHistory表。

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

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

在一个数据库上使用代码优先迁移的多个dbcontext

首先,您必须为迁移配置创建一个"Super"上下文。

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

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

EF6支持每个数据库多个DbContext: http://entityframework.codeplex.com/wikipage?title=Multi-tenant%20Migrations