实体框架迁移忽略WillCascadeOnDelete

时间:2014-12-15 15:32:45

标签: c# entity-framework cascade

以这个问题为例。 Entity Framework (EF) Code First Cascade Delete for One-to-Zero-or-One relationship

我有正常的背景等。

如果我更改了任何内容,我可以按Add-Migration test生成新的迁移。

但是如果我将WillCascadeOnDelete()从true更改为false或添加一些true,它将被实体框架忽略。

我首先使用Code与数据库生成的模型。 在生成的模型中,所有内容都在WillCascadeOnDelete(false)上。 所以现在我将它从false变为true,但被实体框架忽略了。

我试过了:http://msdn.microsoft.com/en-us/data/jj591620.aspx#CascadeDelete

添加此行后...如果我添加Add-Migration newTest,则无法更改。

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>()
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>()

Add-Migration thirdTest也忽略了这一点。

modelBuilder.Conventions.Add<OneToManyCascadeDeleteConvention>()
modelBuilder.Conventions.Add<ManyToManyCascadeDeleteConvention>()

我可以用WillCascadeOnDelete改变一切......它被忽略了!

如果我更改了其他所有内容,则会有效,并会附加到新的迁移中...

此构造的主要类如下。

[Table("SomeToThing")]
public class SomeToThing : Base
{
    [Column("Some")]
    public Guid SomeId { get; set; }
    [ForeignKey("SomeId")]
    public virtual Some Some { get; set; }

    [Column("Thing")]
    public Guid ThingId { get; set; }
    [ForeignKey("ThingId")]
    public virtual Thing Thing { get; set; }
}

我有这张表:

  • 一些
  • SomeToThing

SomeToThing有其他变量,因为我无法将Some直接映射到Thing

2 个答案:

答案 0 :(得分:1)

我知道这个帖子已经过时了,但我遇到了同样的问题。

我的解决方案是删除迁移源文件并从头开始重新构建它。

在我第一次尝试时,我忘记设置OnModelCreating,并且由于充分的原因,SQL Server因循环而拒绝迁移。然后,当我尝试在Add-Migration SameMigrationName方法中删除级联后使用相同名称重新构建迁移时,EF只是不会接受这些特定更改。

然后我删除了迁移源文件并运行了{{1}}。由于MSSQL接受了迁移脚本,因此删除了级联删除,并且似乎有效。我使用的是EF 6.1.3 btw。

答案 1 :(得分:0)

关于我所遇到的问题,我想提到的一件事是,我向我的“ OnModelCreating”(即DbContext)添加了以下代码:

 modelBuilder.Entity<MyEntityTwo>()
                .HasMany(e => e.MyEntityOne)
                .WithRequired(e => e.MyEntityTwo)
                .HasForeignKey(e => e.MyEntityTwoId)
                .WillCascadeOnDelete(false); 

但是我在定义MyEntityOne的表已经定义之后(即在先前的迁移中)添加了它。

结果是,由于我已经在定义表之后将其添加到OnModelCreating中,所以当我添加新的迁移时,实体框架不会“不”提取willcascadeondelete(false)。

要解决此问题,我必须手动将以下内容添加到(新)迁移中:

DropIndex(...this was created by EF for me already.  Not important...);
DropForeignKey("MyEntityOne", "<name of Foreign key goes here ie FK_MyEntityOne_...etc>");
AddForeignKey("MyEntityOne", "MyEntityTwoId", "MyEntityTwo", "Id", cascadeDelete:false);
AlterColumn(...this was created by EF for me already.  Not important...);
CreateIndex(...this was created by EF for me already.  Not important...);

通过添加AddForeignKey行(带有cascadeDelete:false),这次将在删除false上重新应用带有cacade的外键。