我正在尝试附加一个从未从数据库中“拉出”的实体并让它更新现有行。例如,我在MVC(已修改)中传递完整模型,我只是尝试保存它而没有往返首先获取实体,然后进行编辑,因为我已经拥有了之前调用的信息。
我拥有的是:
public static int ModifyExistingEntity<T>(this DbContext db, T updated) where T : class
{
DbSet<T> set = db.Set<T>();
set.Attach(updated);
db.Entry(updated).State = EntityState.Modified;
return db.SaveChanges();
}
但是当我运行它时,我得到了这个:
System.Data.Entity.Infrastructure.DbUpdateConcurrencyException:存储 更新,插入或删除语句会影响意外的数量 行(0)。自实体以来,实体可能已被修改或删除 装了。刷新ObjectStateManager条目。 ---&GT; System.Data.OptimisticConcurrencyException:存储更新,插入或 delete语句影响了意外的行数(0)。实体 自实体加载以来可能已被修改或删除。刷新 ObjectStateManager条目。
这意味着什么都没有更新。我在这里错过了什么?主密钥设置正确,但请记住,实体不是从数据库中提取的,它是根据先前查询的信息+更新构建的。
答案 0 :(得分:0)
您可以使用继承尝试静态扩展可能存在一些问题,
public class MyContext:DbContext {
public int ModifyExistingEntity<T>(this DbContext db, T updated) where T : class
{
DbSet<T> set = Set<T>();
set.Attach(updated);
this.Entry(updated).State = EntityState.Modified;
return SaveChanges();
}
}
答案 1 :(得分:0)
set.Attach(updated);
您不需要以上行,因为它将实体附加到未更改状态的上下文中。您可能正在获得乐观并发异常,因为上下文跟踪的原始值(db值)在这样附加时会被设置为更新值的值。看看是否只使用下面的行,因为它将实体附加到上下文并设置状态。
db.Entry(updated).State = EntityState.Modified;