我想做的很简单。我在数据库中有一个零件列表,我想根据更新列表删除/插入/更新它们。
主要问题是,当我想替换一个条目时,我无法将它附加到上下文中,因为旧的(要更新的)条目已经附加(通过先前的读取调用)并且引发了异常。
我有3个想法。
- 手动分离旧条目并附加新条目(尽管将实体状态更改为已分离仍会引发异常)
- 用新条目手动更改旧条目的值
- 使读取调用不可跟踪(AsNoTracking()),这似乎工作正常,但我担心对延迟加载的影响。
是否有像“context.entry.replace(oldEntry,newEntry)”这样的功能或任何其他适当的方法来做到这一点?
IEnumerable<SoldPart> old = db.SoldParts.Where(sp=>sp.sessionId == sessionId);
var toDelete = old.Where(po=> !parts.Any(pu=>pu.id == po.id));
var toCreate = parts.Where(po => !old.Any(pu => pu.id == po.id));
var toUpdate = parts.Where(po => old.Any(pu => pu.id == po.id));
foreach (SoldPart item in toDelete)
{
db.SoldParts.Attach(item);
db.SoldParts.Remove(item);
}
foreach (SoldPart item in toCreate)
{
db.SoldParts.Add(item);
}
foreach (SoldPart item in toUpdate)
{
db.SoldParts.Attach(item);
db.Entry(item).State = EntityState.Modified;
}
db.SaveChanges();