如何将实体框架设置为使用可选外键级联删除
本文关键字:删除 级联 实体 框架 设置 | 更新日期: 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();
}
}