如何创建现有实体(dbset)的副本,但更改主键?
例如,我有以下代码:
foreach(var item in db.PedidoMassPro_Detail.Where(o => o.Order_Number.Equals(orderNumber)))
{
PedidoMassPro_Detail newItem = item;
newItem.Order_Number = "TESTE111";
db.PedidoMassPro_Detail.Add(newItem);
db.SaveChanges();
}
我收到错误:不允许新事务,因为会话中还有其他线程在运行。
有很多列,所以这就是我没有设置每一列的原因,我需要一份副本,我需要更改的唯一内容是主键(Order_Number)。
答案 0 :(得分:1)
通过指定您希望它们AsNoTracking获取EF中未跟踪对象的列表,如果跟踪它,EF将知道该实体已存在于db中,而不是将其添加为新实体,它将尝试更新。
db.PedidoMassPro_Detail.Where(o => o.Order_Number.Equals(orderNumber).AsNoTracking()
使用toList来实现对象,我认为这是你获得当前错误的原因,在迭代列表时,你试图更改列表,所以首先要确保得到符合条件的项目列表。 / p>
var orderSet = db.PedidoMassPro_Detail.Where(o => o.Order_Number.Equals(orderNumber).AsNoTracking().ToList();
使用单个保存将序列化更改为db
foreach(var item in orderSet )
{
item.Order_Number = "TESTE111";
//handle primary key, is it Guid, auto identity?
db.PedidoMassPro_Detail.Add(item);
}
db.SaveChanges();