我在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视频讨论了这个问题,也没有提出解决方案。
答案 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>());
}
}