[英]Entity framework migrations ignoring WillCascadeOnDelete
例如,看看这个问题。 实体框架 (EF) 代码优先级联删除,用于一对零或一关系
我有一个正常的上下文等。
如果我更改任何内容,我可以根据Add-Migration test
生成一个新的迁移。
但是,如果我将 WillCascadeOnDelete() 从 true 更改为 false 或添加一些 true,则实体框架会忽略它。
我首先将代码与数据库中生成的模型一起使用。 在生成的模型中,一切都在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
。
我知道这个线程很旧,但我只是遇到了同样的问题。
我的解决方案是删除迁移源文件并从头开始重新搭建它。
在我第一次尝试时,我忘记设置.WillCascadeOnDelete(false)
,并且出于充分的理由,SQL Server 由于周期而拒绝了迁移。 然后,当我在OnModelCreating
方法中删除级联后尝试使用相同的名称重新构建迁移时,EF 只是不会选择那些特定的更改。
然后我删除了迁移源文件并运行Add-Migration SameMigrationName
。 由于 MSSQL 接受了迁移脚本,级联删除已被删除,并且似乎有效。 顺便说一句,我正在使用 EF 6.1.3。
关于我遇到的问题,我想提到的一件事是我添加了以下代码(到我的“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,它将重新应用带有cacade on delete false 的外键。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.