6

我有你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; }
}

我试过的

我曾尝试使用流利的模型构建器,但是当我尝试更新数据库时,这个会出错。

在表 'Categories' 上引入 FOREIGN KEY 约束 'FK_dbo.Categories_dbo.Categories_RootCategory_Id' 可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

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

3 回答 3

4

我有同样的问题。关于流畅的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();

希望这可以帮助。

标记

于 2014-01-09T05:26:08.730 回答
0

您似乎对类别和子类别使用相同的模型。没关系,但是当您尝试激活级联删除时,您会收到无限循环,因为它不知道要删除什么。

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

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

modelBuilder.Entity<Category>().HasOptional(x => x.RootCategory).WithMany(x => x.ChildCategories).HasForeignKey(x => x.parentCategoryID).WillCascadeOnDelete(true);
于 2013-09-09T16:22:28.863 回答
0

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

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

每个评论都有自己的 CommentID(主键)和 ParentID(外键,无 CASCADE)。然后我的评论表上有一个数据库触发器:

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 作为父评论的评论。)

请注意,这仅有效,因为我的业务逻辑不允许此评论图上的“循环”,确保该图保持为树。因此,我相信我的触发器不会导致无限循环。

于 2013-09-13T09:05:41.237 回答