如何将实体框架设置为使用可选外键级联删除

本文关键字:删除 级联 实体 框架 设置 | 更新日期: 2023-09-27 17:56:25

>我正在尝试将实体框架设置为使用可选外键在删除时级联。我首先使用代码,我的模型如下所示:

public class Node
{
    [Key]
    public int ID { get; set; }
    [ForeignKey("Parent")]
    public int? ParentID { get; set; }
    public virtual Node Parent { get; set; }
}

我已经看到很多建议的解决方案,"只需使外键成为必需的",但这对我不起作用,因为父节点可能为空。

是否存在不涉及在父节点之前手动删除子节点的解决方案?

如何将实体框架设置为使用可选外键级联删除

这是你要找的吗?

实体框架 (EF) 代码首次级联删除,用于一对一关系

从上面看,它会是这样的(但我还没有尝试过):

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Node>()
        .HasOptional(a => a.Parent)
        .WithOptionalDependent()
        .WillCascadeOnDelete(true);
}

看起来MSSQL是这里的罪魁祸首。因为我的表是自引用的,所以不可能将删除时的级联设置为 true。

相反,我最终所做的是手动递归地标记每个要删除的孩子,然后调用SaveChanges()并让EntityFramework整理其余部分。

下面是一个简单的代码示例来说明:

void Delete(bool recursive = false)
{
    if(recursive)
        RecursiveDelete();
    if(this.Parent != null)
        this.Parent.Children.Remove(this);
    using(var db = new MyContext())
    {
        db.SaveChanges();
    }
}
void RecursiveDelete()
{
    foreach(var child in Children.ToArray())
    {
        child.RecursiveDelete();
        Children.Remove(child);
    }
    using(var db = new MyContext())
    {
        db.Nodes.Attach(this);
        db.Entry(this).State = EntityState.Deleted();
    }
}