8

我有身份证,也有名字。所以本质上,我的方法只有这些参数:

public void Foo(int id, string name)
{
}

我在方法中有这段逻辑:

User user = new User(){ Id = id, Name = name };
Db.Entry(user).State = System.Data.EntityState.Modified;
Db.SaveChanges();

而已。没有什么花哨。我收到此错误:"An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key"

以及 Ladislav Mrnka 的回答:ObjectStateManager 中已经存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象

建议使用context.Entry(oldEntity).CurrentValues.SetValues(newEntity);,但我并没有 oldEntity。谁能告诉我如何只更新用户的 1 个属性?我快疯了。

4

1 回答 1

6

我每个请求只创建一次,创建后我将它存储在 HttpContext.Items 中。因此,即使我向 DB 发出多个请求,它也使用相同的 DbContext。这有帮助吗?

如果“对 DB 的多个请求”中的任何一个加载具有相同 ID 的用户,您将收到此异常。尝试使用这个:

public void Foo(int id, string name) {
   var user = Db.Users.Local.SingleOrDefault(u => u.Id == id);
   if (user == null) {
      user = new User { Id = id };
      Db.Users.Attach(user);
   } 

   user.Name = name;
   Db.SaveChanges();
}

代码首先尝试从已加载的实体中获取用户实例(不对数据库进行查询),并仅在尚未加载用户时创建一个新实例。

于 2012-08-06T17:26:26.677 回答