首页 文章

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

提问于
浏览
2

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

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

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

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

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

即使Scott Allen讨论过这个问题,也没有提出解决方案 .

2 回答

  • 1

    您可以使用database initializer并使用MigrateDatabaseToLatestVersion显式启动迁移 . 此初始化程序允许您明确说明要使用的上下文和配置 . 就像是:

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

    您还可以手动调用所有逻辑,在应用程序启动期间有效地执行与 Update-Database cmdlet相同的操作 . 看看DbMigrator class .

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

相关问题