我最近从 EF6 alpha 1-3 升级到 EF6 beta 1。这意味着我必须重新创建使用 alpha 版本创建的所有迁移。
所以我尝试回滚到使用 EF5 创建的迁移。但是我遇到了错误Introducing FOREIGN KEY constraint on table 可能会导致循环或多个级联路径。我认为这是因为当我为完全相同的问题修复 Up 迁移时,我忽略了修复 Down 迁移。(应该以前读过这个)
无论如何,我没有尝试全部修复,而是尝试重置所有迁移 - 如此处所述。我删除了数据库中的迁移表和所有迁移 .cs 文件,然后在包管理器Enable-Migrations -EnableAutomaticMigrations -Force
和Add-Migration Initial
当我尝试使用现有的数据库初始化程序(自动迁移错误)运行我的应用程序时,它失败了,因为它试图创建已经存在的表。所以我将初始化程序更改为Database.SetInitializer(new DropCreateDatabaseAlways<MyContext>())
这次我得到了Introducing FOREIGN KEY constraint on table 可能会在初始化期间再次导致循环或多级联路径问题
所以我将迁移文件中的所有更改cascadeDelete: true
为cascadeDelete: false
但我仍然得到同样的错误!
更新 1我删除了迁移文件中除了创建 1 个表之外的所有内容,但我得到了同样的错误。某处一定有某种缓存,或者它正在拾取我不知道的文件,或者它正在后台生成自己的迁移
更新 2我认为在使用DropCreateDatabaseAlways
该 EF 时必须始终生成迁移,并且cascadeDelete
在迁移文件中更改为 false 是错误的地方。它应该在 FluentAPI 中完成。所以我将这一行添加modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
到 onmodelcreating 中。而且我还删除了初始迁移文件。然后我运行了应用程序,它正确地生成了一个数据库。我以为我已经破解了它,但是......
我更改了初始化以使用我的原始配置文件:
internal sealed class Configuration : DbMigrationsConfiguration<SID2013Context>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
AutomaticMigrationDataLossAllowed = true;
}
protected override void Seed(etc..
}
然后我运行应用程序,它报告模型已更改。所以我做了 Add-Migration Update-Database 并创建了一个用于创建数据库的迁移文件。
现在的问题是,当我运行应用程序时,它会尝试运行另一个更新(即使 AutomaticMigrationsEnabled = false)。我再次得到“数据库中已经有一个名为'xxx'的对象”问题。迁移表中有一个条目与配置文件的名称不匹配。