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