我将Entity Framework 6作为REST API实现的一部分,而我的端点之一是带有签名的Modify函数
int ModifyEntity(EntityType sourceEntity)
EntityType
具有2个导航属性,并且是整个导航属性组织层次结构的顶部。
在我的Modify函数中,我无法实现特定的情况,其中sourceEntity
的子项集合小于数据库中当前的子项集合,因此必须从数据库实体中删除子项。我执行此操作的算法类似于
List<childEntity> toDelete = new List<childEntity>();
// Iterate through and delete any entity in the one that's not in the other
foreach (var childEntity in entityToModify.CollectionOfChildren)
{
var existingChildren = sourceEntity.CollectionOfChildren.FirstOrDefault(source => source.childId == childEntity.childId);
if (existingCategoryInDatabase == null)
{
toDelete.Add(child);
}
}
foreach (var entity in toDelete)
{
entityToModify.setOfchildEntitys.Remove(entity);
}
基本上,我发现db对象中存在的,不存在于源文件中的所有子级,收集它们,然后进行遍历并删除它们。但是,这样做之后,每次调用.SaveChanges()
时,我总是会遇到异常:
操作失败:由于一个或多个外键属性不可为空,因此无法更改关系。对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。
我对此感到非常困惑,因为我的基础数据库实现对所有相关外键都具有删除级联约束,而我的删除端点仅接受顶级实体ID并调用.Remove()
也是可以的,因此错误对我来说真的没有意义。我不确定如何继续。