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。我的场景是:我不想对每个实体进行级联删除,除了一个实体。