当我的代码在以下位置抛出异常时,我陷入困境:
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。
每次执行创建(实体)方法时都会创建新记录。当我签入数据库时,记录会重复。
答案 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);
}