使用自动迁移将可选FK更新为必需

时间:2013-05-18 09:50:36

标签: entity-framework ef-code-first ef-migrations

我有一个表,它有一个可选的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'不是约束。   无法删除约束。查看以前的错误。

我之前没有看到任何错误(没有内部异常等)。

This post表示您可以通过以下方式解决此错误:

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");
}

但仍然有同样的错误

修改

完整的代码是可用的here,最小的模型如下:

public class Blog
{
    public int Id { get; set; }
    public Securable AuthorSecurable { get; set; }
}

public class Securable
{
    public int Id { get; set; }
}

0 个答案:

没有答案