附加“XXX”类型的实体失败,因为同一类型的另一个实体已具有相同的主键值

时间:2018-03-28 09:37:51

标签: c# .net entity-framework entity-framework-6 repository-pattern

当我的代码在以下位置抛出异常时,我陷入困境:

dbContext.Entry(entity).State = EntityState.Modified;

自上个月以来,我一直在使用此代码,但这个例外仅在两天前提出。我读过许多帖子,但没有一个让我受益。 问题是当尝试更新现有记录时,它总是显示在下面的错误:

  

附加类型为“X”的实体失败,因为同一类型的另一个实体已具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新的并且尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“已添加”实体状态来跟踪图表,然后根据需要将非新实体的状态设置为“未更改”或“已修改”。

我使用了以下代码:

{
    if (unitOfWork.AddressRepository.DataSet.Where(x => x.AddressId == item.AddressId).ToList().Count() > 0)
       unitOfWork.AddressRepository.Update(item);
    else
       unitOfWork.AddressRepository.Create(item);
}  
public virtual void Update(T entity)
{
    dbContext.Entry(entity).State = EntityState.Modified;
} 

出于测试目的,我还使用“更新”方法进行了实验。

try
{
    dbContext.Entry(entity).State = EntityState.Modified;
}
catch (Exception ex)
{
    Create(entity);
}

public virtual void Create(T entity)
{
    dbSet.Add(entity);
}

//constructor taking the database context and getting the appropriately typed data set from it
public Repository(DBEntities context)
{
    dbContext = context;
    dbSet = context.Set<T>();
}

我在构造函数中填充了dbContext。所以我总是在开始时得到dbContext。

每次执行创建(实体)方法时都会创建新记录。当我签入数据库时​​,记录会重复。

1 个答案:

答案 0 :(得分:1)

两天后,我终于得到了我想分享的帮助他人的解决方案。

实际上,我使用web apis从客户端接收数据,填充模型然后调用entity.modified。但实体框架只更新其当前的dbContext。所以首先,我从dbContext获取特定数据,然后通过&#34; AutoMapper &#34;更新该特定对象。鉴于以下代码解释了一切。

{
   //--get particular data from dbContext 
   var _address = unitOfWork.AddressRepository.GetById(address.AddressId);
   Mapper.CreateMap<Data.Concrete.Address, Data.Concrete.Address>();
   //--update that particular object via autoMapper
   var _customAddress = Mapper.Map<Address, Address>(address, _address);
       if (unitOfWork.AddressRepository.DataSet.Where(x => x.AddressId == address.AddressId).ToList().Count() > 0)
          unitOfWork.AddressRepository.Update(_customAddress);
       else
          unitOfWork.AddressRepository.Create(address);
}