实体框架不会级联删除子实体

时间:2015-05-07 10:09:03

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

我有父母和子女实体。在db中,关系设置为“ON DELETE CASCADE”。

该关系的EF代码优先Fluent api映射是:

this.HasMany(t => t.Children)
    .WithOptional()
    .HasForeignKey(d => d.ParentId)
    .WillCascadeOnDelete();

删除实体的代码是:

public virtual void Delete(Parent entity)
{
    DbEntityEntry dbEntityEntry = dataContext.GetEntry(entity);
    if (dbEntityEntry.State != EntityState.Deleted)
    {
        dbEntityEntry.State = EntityState.Deleted;
    }

    else
    {
        dbSet.Attach(entity);
        dbSet.Remove(entity);
    }
}

当我尝试删除父实体时,我得到以下异常:

  

操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

由于级联删除已正确设置,EF不会自动执行级联删除吗?

或者我应该在删除父实体之前手动删除子项吗?

修改

我将以下代码添加到上述Delete方法中:

if (entity.Children != null)
{
    dataContext.Set<Child>().RemoveRange(entity.Children);
}

成功删除子记录和父记录。

以上代码真的有必要吗? EF / SQL Server不应该处理级联删除吗?

0 个答案:

没有答案