8

私はIDを持っており、名前も持っています。したがって、本質的に、私のメソッドには次のパラメータがあります。

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

リクエストごとに1回だけ作成し、作成したら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 に答える