代码第一个一对多自引用 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 错误的主要内容,如果未能解决你的问题,请参考以下文章

prisma 模式中的一对多自关系

Sequelize 多对多自引用

Hibernate的一对多自关联中的级联删除问题

带有额外列的多对多自引用原则

sqlalchemy中的多对多自引用关系

从教义中的多对多自引用实体中获取孩子