0

我正在尝试附加一个从未从数据库中“拉出”的实体并让它更新现有行。例如,我在 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 条目。---> System.Data.OptimisticConcurrencyException:存储更新、插入或删除语句影响了意外的行数 (0)。自加载实体后,实体可能已被修改或删除。刷新 ObjectStateManager 条目。

这意味着没有任何更新。我在这里想念什么?主键设置正确,但请记住,实体不是从数据库中提取的,它是根据先前查询的信息 + 更新构建的。

4

2 回答 2

0
set.Attach(updated);

您不需要上述行,因为它将实体以未更改的状态附加到上下文。您可能会遇到乐观并发异常,因为在这样附加时,上下文跟踪的原始值(db 值)被设置为更新值的值。看看是否只使用下面的行,因为它既将实体附加到上下文并设置状态。

db.Entry(updated).State = EntityState.Modified;

http://msdn.microsoft.com/en-us/data/jj592676.aspx

于 2012-12-20T07:47:13.970 回答
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();
  }

}
于 2012-12-19T03:16:35.247 回答