0

我与子实体上的不可为空的外键列存在一对多关系。我正在尝试从子表中删除一条记录,但似乎无法使其正常工作。

我最终得到类似于以下内容的消息 - 发生引用完整性约束冲突:当依赖对象未更改时,作为引用完整性约束一部分的主键属性无法更改,除非将其设置为关联的主体对象。主体对象必须被跟踪并且不被标记为删除

我试图通过调用 context.Set().Remove(entity) 来删除对象...

我尝试从父集合中删除实体,然后在调用保存更改之前将其删除。我也尝试过直接删除子实体,但无论我做什么,我似乎都无法让它工作。

在实体框架 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();
    }

我还尝试从父实体集合中删除该项目并仅更新父实体。我想我可以,一旦我得到列表,如果我需要删除孩子,从上下文中重新加载它们然后删除它们(但这似乎没有必要从我的上下文开始加载项目)。我一定在这里遗漏了一些重要的东西......

4

1 回答 1

1

好的,所以这里的问题最终是我最终尝试删除(或修改/附加到上下文)的项目不是从原始查询中提取到数据库的代理。因此,实体框架抱怨,因为尽管我试图修改它已经使用新实体值跟踪的实体的主键(例外,虽然正确,但具有误导性)。

这里的解决方案是确保当上下文已经开始跟踪同一实体的代理版本时,我不会尝试使用非代理实体附加或更新。

于 2013-08-06T13:35:07.657 回答