以这个问题为例。 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
有其他变量,因为我无法将Some
直接映射到Thing
。
答案 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的外键。