我有父母和子女实体。在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不应该处理级联删除吗?