EF5我可以附加一个从未从Db查询过的实体吗?

时间:2012-12-18 23:14:17

标签: entity-framework entity-framework-5

我正在尝试附加一个从未从数据库中“拉出”的实体并让它更新现有行。例如,我在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条目。

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

2 个答案:

答案 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;

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

相关问题