EF中出现重复键异常

本文关键字:异常 EF | 更新日期: 2023-09-27 17:57:50

以下是使用EF 向sql server添加新实体的简单代码

   var isNewEntity = entity.Id == 0;
        if (isNewEntity)
        {
            _unitOfWork.Context.DbTripReportDefinitionSectionSet.Add(entity);
        }
        else
        {
            ObjectStateEntry stateEntry;
            _unitOfWork.ObjectStateManager.TryGetObjectStateEntry(entity, out stateEntry);
            if (stateEntry == null)
            {
                _unitOfWork.Context.DbTripReportDefinitionSectionSet.Attach(entity);
            }
            _unitOfWork.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
        }
        _unitOfWork.Save();
        return entity.Id;

问题是我有一个异常

'ObjectStateManager中已存在具有相同键的对象。ObjectStateManager无法跟踪具有相同属性的多个对象钥匙。"的已存在,但未跟踪实体。

因此_unitOfWork.ObjectStateManager.TryGetObjectStateEntry(entity, out stateEntry);返回false,而此代码_unitOfWork.Context.DbTripReportDefinitionSectionSet.Attach(entity);抛出异常。我想是因为已经附加了导航属性。如何在没有导航属性的情况下附加这些实体?或者我如何用另一种方式解决这些问题?

EF中出现重复键异常

如果没有更多信息,我可能会建议您创建一个新的Context实例。

很可能您对导航属性的假设是正确的;但是,与其试图修复代码,不如创建一个新的context,除非在同一事务中有需要提交的操作(我假设您使用的是工作单元模式)。