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

时间:2014-04-02 15:08:21

标签: c# entity-framework ef-code-first

我正在尝试将Entity Framework设置为使用可选的外键在delete上级联。我首先使用代码,我的模型看起来像这样:

public class Node
{
    [Key]
    public int ID { get; set; }

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

我见过很多解决方案,建议“只需要输入外键”,但这对我不起作用,因为父节点可能为空。

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

2 个答案:

答案 0 :(得分:3)

这是你在找什么?

Entity Framework (EF) Code First Cascade Delete for One-to-Zero-or-One relationship

从上面来看,它会像(但我还没试过):

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

    modelBuilder.Entity<Node>()
        .HasOptional(a => a.Parent)
        .WithOptionalDependent()
        .WillCascadeOnDelete(true);
}

答案 1 :(得分:2)

看起来MSSQL应该归咎于此。因为我的表是自引用的,所以不可能将delete上的级联设置为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();
    }
}