代码第一个一对多自引用 WillCascadeOnDelete 错误
Posted
技术标签:
【中文标题】代码第一个一对多自引用 WillCascadeOnDelete 错误【英文标题】:Code first one to many self reference WillCascadeOnDelete Error 【发布时间】:2016-03-27 16:13:29 【问题描述】:我正在尝试首先使用 EF6 代码进行一对多自引用。我的实体看起来像这样
public class Menu
public int Id get; set;
public bool Target get; set;
public string Url get; set;
[DefaultValue(null)]
public int? ParentMenuId get; set;
public virtual Menu ParentMenu get; set;
public virtual List<Menu> ChildMenus get; set;
在我的上下文类中,我这样做是为了使用 WillCascadeOnDelete(true) 进行自我引用
modelBuilder.Entity<Menu>()
.HasOptional(c => c.ParentMenu)
.WithMany(c => c.ChildMenus)
.HasForeignKey(c => c.ParentMenuId)
.WillCascadeOnDelete(true);
但是当我在包管理器控制台中更新数据库时,它给出了一个错误
在表“Menus”上引入 FOREIGN KEY 约束“FK_dbo.Menus_dbo.Menus_ParentMenuId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。 无法创建约束或索引。查看以前的错误。 enter image description here
【问题讨论】:
你有WillCascadeOnDelete(true)
。有什么问题?
我在包管理器控制台中更新数据库时收到错误
你还是什么都没问,只是讲了一个小故事。你想要级联删除,SQL server 告诉你不能,甚至解释为什么不能。真的,我不是想唠叨你,但我不知道你在问什么。
我的问题是 - 为什么我在包管理器控制台中收到错误
我应该在我的模型中改变什么
【参考方案1】:
最后发现code first self reference entity Cascade Delete没有办法,应该写递归函数进行级联删除
【讨论】:
这不是代码优先的限制,而是 SQL-Server 的限制。以上是关于代码第一个一对多自引用 WillCascadeOnDelete 错误的主要内容,如果未能解决你的问题,请参考以下文章