如何在自引用关系上设置级联
本文关键字:设置 级联 关系 自引用 | 更新日期: 2023-09-27 18:30:51
>我有默认场景,你有Category
本身,RootCategory
和ChildCategories
。如何指定我的流畅模型生成器以在删除时级联所有子类别?
型
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 图上使用"周期",确保该图保持为树。因此,我相信我的触发器不会导致无限循环。