实体框架如何更新列表记录

时间:2017-03-06 11:09:18

标签: c# entity-framework transactions updates

我有列表对象,并尝试检查并更新该列表中的这些项目,这是我的代码:

using (var uow = new WareHouseUnitOfWork(WareHouseConnection))
{
  foreach (var item in lData)
  {
    if (uow.UsageSessionWareHouseRepository.Contains(x => x.RadAcctRefId == item.RadAcctRefId))
    {
      uow.UsageSessionWareHouseRepository.Context.Entry(item);
      uow.UsageSessionWareHouseRepository.DbSet.Attach(item);
      uow.UsageSessionWareHouseRepository.Context.Entry(item).State = EntityState.Modified;
    }
    else
    {
      uow.UsageSessionWareHouseRepository.DbSet.Add(item);
    }
  }

  session.SessionStatus = "Processed";
  var entry = uow.SessionWareHouseRepository.Context.Entry(session);
  uow.SessionWareHouseRepository.DbSet.Attach(session);
  entry.State = EntityState.Modified;

  uow.Save();
  }

在第一个循环中,everthing很好但在下一个我得到一个错误:

  

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

我不知道如何更新像DbSet.Add(item)。

1 个答案:

答案 0 :(得分:0)

找到您可以直接编辑的记录后,您不必再次进行附加,或者已经为您跟踪了EntryState.modified