我与子实体上的非可空外键列有一对多的关系。我试图从子表中删除一条记录,但似乎无法让它工作。
我最终得到类似于以下内容的消息 - 发生了引用完整性约束违规:当依赖对象不变时,无法更改作为参照完整性约束一部分的主键属性,除非将其设置为关联& #39;主要对象。必须跟踪主要对象并且不标记为删除
我试图通过调用context.Set()删除对象。删除(实体)...
我尝试从父集合中删除实体,然后在调用保存更改之前将其删除。我也尝试过直接删除子实体,但不管我做什么,我似乎无法让它工作。
在实体框架5中删除具有不可为空的外键关系的子实体的正确方法是什么?
这是我的映射配置:
这有效 -
var item = this.unitOfWork.PersonalListItemRepository.GetFirst(x => x.PersonalListID == 45146 && x.ItemCode == "1030943" && x.UOM == "EA");
this.unitOfWork.PersonalListItemRepository.Delete(item);
删除实现很简单 -
this.context.Set<T>().Remove(item);
但是这不起作用 -
var listToUpdate =
this.unitOfWork.PersonalListRepository.FindByExpression(
x => x.PersonalListID == personalList.PersonalListID).First();
var entityToDelete = listToUpdate.PersonalListItems.First();
this.unitOfWork.PersonalListItemRepository.Delete(entityToDelete);
FindByExpression的实现 -
public ICollection<T> FindByExpression(Expression<Func<T, bool>> expression)
{
return context.Set<T>().Where(expression).ToList();
}
我还试图从父实体集合中删除该项目,然后只更新父项。我想我可以,一旦我得到了我需要删除的孩子的列表,从上下文中重新加载它们然后删除它们(但这似乎是不必要的,因为项目是从我的上下文加载开始的)。我一定错过了一些重要的东西......
答案 0 :(得分:1)
好的,所以这里的问题最终是我最终试图删除(或修改/附加到上下文)的项目不是从原始查询中提取到数据库的代理。因此,实体框架正在抱怨,因为虽然我试图修改一个实体的主键,但它已经在跟踪一个新的实体值(例外情况,虽然正确,但却具有误导性)。
此处的解决方案是确保在上下文已开始跟踪同一实体的代理版本时,我不会尝试使用非代理实体进行附加或更新。