编辑
:使用原始答案
Find代替
Local.SingleOrDefault。它与@Juan的
Save方法结合使用,但是可能导致对数据库的不必要查询,并且
else部分可能从未执行(执行else部分会导致异常,因为Find已查询数据库并且未找到实体,因此无法更新该实体)
。感谢@BenSwayne找到问题。
您必须检查上下文是否已跟踪具有相同键的实体,并修改该实体而不是附加当前实体:
public override void Update(T entity) where T : IEntity { if (entity == null) { throw new ArgumentException("Cannot add a null entity."); } var entry = _context.Entry<T>(entity); if (entry.State == EntityState.Detached) { var set = _context.Set<T>(); T attachedEntity = set.Local.SingleOrDefault(e => e.Id == entity.Id); // You need to have access to key if (attachedEntity != null) { var attachedEntry = _context.Entry(attachedEntity); attachedEntry.CurrentValues.SetValues(entity); } else { entry.State = EntityState.Modified; // This should attach entity } }}如您所见,主要问题是
SingleOrDefault方法需要知道查找实体的键。您可以创建暴露密钥的简单界面(
IEntity在我的示例中),并在要处理的所有实体中实现它。



