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

时间:2014-09-14 06:03:34

标签: asp.net-mvc entity-framework code-first asp.net-identity dbcontext

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

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

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

有两个DbContexts以某种方式阻止我自动更新数据库。如果我在为模型更改创建迁移后只有一个DbContext,它将在我第一次尝试访问网站时自动运行。这不会再发生了,总是我必须手动运行“update-database”命令。

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

即使Scott Allen的this视频讨论了这个问题,也没有提出解决方案。

2 个答案:

答案 0 :(得分:1)

您可以使用database initializer并使用MigrateDatabaseToLatestVersion明确启动迁移。此初始化程序允许您明确说明要使用的上下文和配置。类似的东西:

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

您还可以手动调用所有逻辑,有效地与Update-Database cmdlet一样,在应用启动期间需要。看看DbMigrator class

答案 1 :(得分:1)

您可以单独在每个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>());
    }
}