使用多个DbContext自动更新数据库



我在ASP.NET 5项目中使用EF6。我使用ASP.NET Identity作为身份验证机制。正如任何人都会做的那样,我在一个单独的dll项目中建模了我的域对象,对于数据访问逻辑,我有一个独立的项目。此数据项目包含EF迁移、域模型的DbContext、存储库和工作单元。

我有一个服务层,它由ASP.NET控制器联系,这个服务层将与数据层通信并执行所需的操作。

在主ASP.NET web项目中,我有默认的DbContext,它与Identity及其迁移有关。

由于有两个DbContext,我无法自动更新数据库。如果我在为模型更改创建迁移后只有一个DbContext,它将在我第一次尝试访问网站时自动运行。这种情况不再发生了,我总是必须手动运行"更新数据库"命令。

我现在的一个解决方案是在我的数据项目中添加对"Microsoft.AspNet.Identity.EntityFramework"的引用,并使用Identity上下文包含我的域表。但是,除非我没有其他选择,否则我不想在我的数据项目中添加ASP.NET引用。因为数据层甚至并没有和web层直接通信。

尽管Scott Allen的这段视频讨论了这个问题,但并没有提出解决方案。

您可以通过使用数据库初始值设定项和MigrateDatabaseToLatestVersion显式启动迁移。此初始值设定项允许您显式声明要使用的上下文和配置。类似于:

SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>()); 

您还可以手动调用所有逻辑,在应用程序启动过程中根据需要执行与Update-Database cmdlet相同的操作。看看DbMigrator类。

您可以在每个DbContext构造函数中分别运行迁移。

public class DataContext: DbContext 
{
    static DaraContext() 
    {
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<DataContext, Configuration>());
    }
}

public class ApplicationDbContext : IndetityDbContext 
{
    static ApplicationDbContext() 
    {
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDbContext, Configuration>());
    }
}

相关内容

  • 没有找到相关文章

最新更新