【发布时间】:2013-07-17 19:29:21
【问题描述】:
我最近从 EF6 alpha 1-3 升级到 EF6 beta 1。This 意味着我必须重新创建使用 alpha 版本创建的所有迁移。
所以我尝试回滚到使用 EF5 创建的迁移。但是我遇到了错误在表上引入 FOREIGN KEY 约束可能会导致循环或多个级联路径。我认为这是因为当我为完全相同的问题修复 Up 迁移时,我忽略了修复 Down 迁移。 (之前应该看过this)
无论如何,我没有尝试全部修复,而是尝试重置所有迁移 - 如 here 所述。我删除了数据库中的迁移表和所有迁移 .cs 文件,然后在包管理器 Enable-Migrations -EnableAutomaticMigrations -Force 和 Add-Migration Initial
当我尝试使用现有的数据库初始化程序(自动迁移错误)运行我的应用程序时,它失败了,因为它试图创建已经存在的表。所以我将初始化程序更改为Database.SetInitializer(new DropCreateDatabaseAlways<MyContext>())
这次我得到了在表上引入 FOREIGN KEY 约束可能会在初始化期间再次导致循环或多个级联路径问题
所以我将迁移文件中的所有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'的对象”问题。迁移表中有一个条目与配置文件的名称不匹配。
【问题讨论】:
-
许多更改数据库以删除现有索引/es 上删除时的级联然后重试。在代码中重复。即在代码中添加一个 csacade on delete false 以确保。
-
我已经删除了我现有的数据库。我已更改连接字符串中初始目录的名称。外键约束一定有问题。 Mybe是时候看看正在生成的sql了....
标签: entity-framework entity-framework-migrations