Entity Framework 6 尝试在重命名时删除不存在的索引
Entity Framework 6 trying to drop non existent Index when renaming
作为 EF 迁移的新手,我对以下行为感到惊讶,并想知道它是否是故意的(即有一个开关让它消失)。
重命名列时,在 EntityTypeConfiguration class 中有以下相关行:
Property(x => x.MyColumn).HasColumnName(@"MyColumn").HasColumnType("nvarchar").IsOptional();
而且,至关重要的是:
HasOptional(a => a.RelatedTable).WithMany(b => b.ThisTable).HasForeignKey(c => c.MyColumn).WillCascadeOnDelete(false);
也就是我理解的建立外键关系。当我将 MyColumn 重命名为 MyColumn2 时,创建的迁移如下所示:
public override void Up()
{
RenameColumn(table: "dbo.ThisTable", name: "MyColumn", newName: "MyColumn2");
RenameIndex(table: "dbo.ThisTable", name: "IX_MyColumn", newName: "IX_MyColumn2");
}
但是,MyColumn
未在 ThisTable
上编入索引。我意识到为外键关系创建索引是可取的;这就是为什么 EF 假设有一个吗?
请注意,EF 模型最初是使用 EF 反向 POCO 生成器从数据库生成的。
这是故意的。 Code First 迁移完全基于模型(数据注释、流畅的配置),并假设以前的数据库状态也是使用迁移创建的。由于 EF 默认约定是为 FK 列创建索引,因此迁移假定索引存在并尝试重命名它。
您可以通过两种方式解决。编辑生成的迁移并删除 RenameIndex
(以及其他与索引相关的命令),或者关闭(删除)默认的 FK 索引约定:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<ForeignKeyIndexConvention>();
// ...
}
请注意,后者会影响您未来的模型修改,您必须明确选择 FK 列上的索引(如果实体没有明确的 FK 属性,则无法完成)。此外,如果您重命名某些 do 具有索引的现有 FK 列,则必须手动添加 RenameIndex
(或 DropIndex/
CreateIndex`)命令.
作为 EF 迁移的新手,我对以下行为感到惊讶,并想知道它是否是故意的(即有一个开关让它消失)。
重命名列时,在 EntityTypeConfiguration class 中有以下相关行:
Property(x => x.MyColumn).HasColumnName(@"MyColumn").HasColumnType("nvarchar").IsOptional();
而且,至关重要的是:
HasOptional(a => a.RelatedTable).WithMany(b => b.ThisTable).HasForeignKey(c => c.MyColumn).WillCascadeOnDelete(false);
也就是我理解的建立外键关系。当我将 MyColumn 重命名为 MyColumn2 时,创建的迁移如下所示:
public override void Up()
{
RenameColumn(table: "dbo.ThisTable", name: "MyColumn", newName: "MyColumn2");
RenameIndex(table: "dbo.ThisTable", name: "IX_MyColumn", newName: "IX_MyColumn2");
}
但是,MyColumn
未在 ThisTable
上编入索引。我意识到为外键关系创建索引是可取的;这就是为什么 EF 假设有一个吗?
请注意,EF 模型最初是使用 EF 反向 POCO 生成器从数据库生成的。
这是故意的。 Code First 迁移完全基于模型(数据注释、流畅的配置),并假设以前的数据库状态也是使用迁移创建的。由于 EF 默认约定是为 FK 列创建索引,因此迁移假定索引存在并尝试重命名它。
您可以通过两种方式解决。编辑生成的迁移并删除 RenameIndex
(以及其他与索引相关的命令),或者关闭(删除)默认的 FK 索引约定:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<ForeignKeyIndexConvention>();
// ...
}
请注意,后者会影响您未来的模型修改,您必须明确选择 FK 列上的索引(如果实体没有明确的 FK 属性,则无法完成)。此外,如果您重命名某些 do 具有索引的现有 FK 列,则必须手动添加 RenameIndex
(或 DropIndex/
CreateIndex`)命令.