我有一个表,该表具有另一个表的可选 FK,并希望将该 FK 更改为所需的关系。
我为此更新启用了自动迁移并启用了破坏性更改。数据库中的所有实体也都填充了这个键。
我改变了这个:
modelBuilder.Entity<Blog>().HasOptional(b => b.AuthorSecurable).WithMany().Map(b => b.MapKey("AuthorSecurableId"));
至:
modelBuilder.Entity<Blog>().HasRequired(b => b.AuthorSecurable).WithMany().Map(b => b.MapKey("AuthorSecurableId"));
并得到以下错误:
'FK_dbo.Blogs_dbo.Securables_AuthorSecurableId' 不是约束。无法删除约束。请参阅以前的错误。
我看不到以前的错误(没有内部异常等)
这篇文章说您可以通过以下方式解决此错误:
ALTER TABLE [dbo].[Blogs] NOCHECK CONSTRAINT [FK_dbo.Blogs_dbo.Securables_AuthorSecurable_Id]
所以我做了:
public override void Up()
{
Sql("ALTER TABLE [dbo].[Blogs] NOCHECK CONSTRAINT [FK_dbo.Blogs_dbo.Securables_AuthorSecurable_Id]");
DropForeignKey("dbo.Blogs", "AuthorSecurableId", "dbo.Securables");
DropIndex("dbo.Blogs", new[] { "AuthorSecurableId" });
AlterColumn("dbo.Blogs", "AuthorSecurableId", c => c.Int(nullable: false));
AddForeignKey("dbo.Blogs", "AuthorSecurableId", "dbo.Securables", "Id", cascadeDelete: true);
CreateIndex("dbo.Blogs", "AuthorSecurableId");
}
但仍然得到同样的错误
编辑:
完整的代码在这里可用,最小模型如下:
public class Blog
{
public int Id { get; set; }
public Securable AuthorSecurable { get; set; }
}
public class Securable
{
public int Id { get; set; }
}