C# 附加类型为'的实体;XXX和x27;失败,因为相同类型的另一个实体已具有相同的主键值

C# 附加类型为'的实体;XXX和x27;失败,因为相同类型的另一个实体已具有相同的主键值,c#,.net,entity-framework,entity-framework-6,repository-pattern,C#,.net,Entity Framework,Entity Framework 6,Repository Pattern,当我的代码在以下位置引发异常时,我陷入困境: dbContext.Entry(entity).State = EntityState.Modified; 我从上个月就开始使用这段代码,但两天前就出现了这个异常。我读过很多文章,但没有一篇对我有益。 问题是当尝试更新现有记录时,它总是显示以下错误: 附加类型为“X”的实体失败,因为相同类型的另一个实体已具有相同的主键值。如果图形中的任何实体具有冲突的键值,则在使用“Attach”方法或将实体状态设置为“Unchanged”或“Modified”时

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

dbContext.Entry(entity).State = EntityState.Modified;
我从上个月就开始使用这段代码,但两天前就出现了这个异常。我读过很多文章,但没有一篇对我有益。 问题是当尝试更新现有记录时,它总是显示以下错误:

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

我使用了以下代码:

{
    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;
} 
出于测试目的,我还使用“Update”方法做了一个实验

试试看
{
dbContext.Entry(entity.State=EntityState.Modified;
}
捕获(例外情况除外)
{
创建(实体);
}
公共虚拟空创建(T实体)
{
添加(实体);
}
//构造函数获取数据库上下文并从中获取适当类型的数据集
公共存储库(DBEntities上下文)
{
dbContext=context;
dbSet=context.Set();
}
我已经在构造函数中填充了dbContext。所以我总是在一开始就得到dbContext


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

两天后,我终于找到了帮助他人的解决方案

实际上,我使用web API从客户端接收数据,填充模型,然后调用entity.modified。但实体框架只更新其当前的dbContext。因此,首先,我从dbContext获取特定数据,然后通过“AutoMapper”更新特定对象。下面给出的代码解释了一切

{
   //--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);
}
{
//--从dbContext获取特定数据
var _address=unitOfWork.AddressRepository.GetById(address.AddressId);
CreateMap();
//--通过autoMapper更新特定对象
var\u customAddress=Mapper.Map(地址,\u地址);
if(unitOfWork.AddressRepository.DataSet.Where(x=>x.AddressId==address.AddressId).ToList().Count()>0)
unitOfWork.AddressRepository.Update(\u customAddress);
其他的
unitOfWork.AddressRepository.Create(地址);
}

两天后,我终于找到了帮助他人的解决方案,希望与大家分享

实际上,我使用web API从客户端接收数据,填充模型,然后调用entity.modified。但实体框架只更新其当前的dbContext。因此,首先,我从dbContext获取特定数据,然后通过“AutoMapper”更新特定对象。下面给出的代码解释了一切

{
   //--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);
}
{
//--从dbContext获取特定数据
var _address=unitOfWork.AddressRepository.GetById(address.AddressId);
CreateMap();
//--通过autoMapper更新特定对象
var\u customAddress=Mapper.Map(地址,\u地址);
if(unitOfWork.AddressRepository.DataSet.Where(x=>x.AddressId==address.AddressId).ToList().Count()>0)
unitOfWork.AddressRepository.Update(\u customAddress);
其他的
unitOfWork.AddressRepository.Create(地址);
}