如何在自引用关系上设置级联

本文关键字:设置 级联 关系 自引用 | 更新日期: 2023-09-27 18:30:51

>我有默认场景,你有Category本身,RootCategoryChildCategories。如何指定我的流畅模型生成器以在删除时级联所有子类别?

public class Category
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual Category RootCategory { get; set; }
    public virtual ICollection<Category> ChildCategories { get; set; }
    public virtual ICollection<Item> Items { get; set; }
}

我试过什么

我尝试使用流畅的模型生成器,但是当我尝试更新数据库时,这个模型会出错。

引入外键约束 "FK_dbo。Categories_dbo。桌上Categories_RootCategory_Id "类别"可能会导致循环或多个级联路径。指定开 删除"无操作"或"更新无操作",或修改其他外键 约束。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Category>().HasOptional(x => x.RootCategory).WithMany(x => x.ChildCategories).WillCascadeOnDelete(true);
}

如何在自引用关系上设置级联

我遇到了同样的问题。关于流畅的 API 配置,我不知道你是否可以在那里做。您可以做的是将 WillCascadeOnDelete 设置为 false,然后自己删除 ChildCategories。

private void DeleteChildCategories(Category category) 
{
    foreach (Category subCategory in category.ChildCategories.ToList())
        {
            if (subCategory.SubCategories.Count() > 0)
            {
                DeleteChildCategories(subCategory);
            }
            else
            {
                _db.Category.Remove(subCategory);
            }
        }
    _db.Category.Remove(category);
}

然后,您可以在删除控制器操作中的类别时调用 DeleteChildCategories。

DeleteChildCategories(Category);
_db.SaveChanges();

希望这有帮助。

马克

您似乎对类别和子类别使用相同的模型。没关系,但是当您尝试激活级联删除时,您会收到无限循环,以防它不了解要删除的内容。

我认为,您需要在模型中parentCategoryID属性。在这种情况下,您将拥有牢固的关系,并且级联删除应该有效。

编辑:我的意思是,如果您有parentCategoryID,您可以尝试按如下方式修改代码:

modelBuilder.Entity<Category>().HasOptional(x => x.RootCategory).WithMany(x => x.ChildCategories).HasForeignKey(x => x.parentCategoryID).WillCascadeOnDelete(true);

我记得我有一个类似的问题。我希望这有帮助:

我有一个评论实体,它可以有回复(其他评论),创建一个"无限的评论树"。

每个注释都有自己的注释ID(主键)以及父ID(外键,无级联)。然后我的注释表上有一个数据库触发器:

CREATE TRIGGER [dbo].[Trigger_DeleteChildComments]
ON [dbo].[Comment]
FOR DELETE
AS
BEGIN
    SET NoCount ON
    DELETE FROM Comment WHERE ParentID IN (SELECT CommentID FROM DELETED)
END

(或者:"删除注释 c 后,删除所有其他以 c 为父项的评论。

请注意,这仅适用于我的业务逻辑不允许在此 Comment 图上使用"周期",确保该图保持为树。因此,我相信我的触发器不会导致无限循环。