C# 忽略WillCascadeOnDelete的实体框架迁移

C# 忽略WillCascadeOnDelete的实体框架迁移,c#,entity-framework,cascade,C#,Entity Framework,Cascade,以这个问题为例。 我有一个正常的上下文等等 如果我更改了任何内容,我可以根据addmigrationtest生成新的迁移 modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>() modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>() modelBuilder.Conventions.Add<OneToM

以这个问题为例。

我有一个正常的上下文等等

如果我更改了任何内容,我可以根据
addmigrationtest
生成新的迁移

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>()
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>()
modelBuilder.Conventions.Add<OneToManyCascadeDeleteConvention>()
modelBuilder.Conventions.Add<ManyToManyCascadeDeleteConvention>()
但如果我将WillCascadeOnDelete()从true更改为false,或者添加一些带有true的值,实体框架将忽略它

我首先使用代码从数据库生成模型。 在生成的模型中,所有内容都处于启用状态
WillCascadeOnDelete(false)
。 所以现在我把它从false改为true,但它被实体框架忽略了

我也试过这个

添加这行之后。。。如果我添加
add Migration newTest
,则不会发生任何更改

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>()
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>()
modelBuilder.Conventions.Add<OneToManyCascadeDeleteConvention>()
modelBuilder.Conventions.Add<ManyToManyCascadeDeleteConvention>()
我可以用意志力改变一切。。。它被忽略了

如果我更改了所有其他内容,它将工作并附加到新的迁移中

此构造的主要类如下所示

[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
直接映射到
Thing
我知道这个线程很旧,但我也遇到了同样的问题

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

在第一次尝试时,我忘记设置
。WillCascadeOnDelete(false)
,出于充分的理由,SQL Server拒绝了迁移,原因是循环。然后,当我在
OnModelCreating
方法中删除级联之后,尝试使用相同的名称重新构建迁移时,EF不会接受这些特定的更改


然后我删除了迁移源文件并运行了
addmigrationsamemempigrationname
。由于MSSQL接受了迁移脚本,级联删除已被删除,并且似乎有效。顺便说一句,我正在使用EF 6.1.3。

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

modelBuilder.Entity()
.HasMany(e=>e.MyEntityOne)
.WithRequired(e=>e.MyEntityTwo)
.HasForeignKey(e=>e.MyEntityTwoId)
.WillCascadeOnDelete(假);
但是我在定义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...);
DropIndex(…这是EF为我创建的。不重要;
DropForeignKey(“MyEntityOne”);
AddForeignKey(“MyEntityOne”、“MyEntityTwoId”、“MyEntityTwoId”、“Id”,删除:false);
AlterColumn(…这是EF为我创建的。不重要;
CreateIndex(…这是EF为我创建的。不重要;

通过添加AddForeignKey行,使用cascadeDelete:false,这次将使用cacade在delete false上重新应用外键。

您始终可以编写自己的迁移是的,这是我在添加迁移后尝试的不起作用。。。我认为这是我的失败,而不是添加迁移工具的失败。。。因为我问社区:)迁移并不是万能的。如果我没记错的话,它也不会添加唯一的索引。你有一个迁移函数/字符串示例,它可以将外键更改为CascadeDelete:true??提前谢谢!我也有这个问题,似乎当您有某种继承,并且您试图配置派生实体时,实体框架会无缘无故地忽略WillCascadeOnDelete。我的场景是:我不想对每个实体进行级联删除,除了一个实体。