8

私は私とIDを持っており、私は私と一緒に名前を持っています。なぜ私はEFの簡単なアップデートのためにすべてのハードルに陥っていますか?

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(); 

を。何もない。ラディスラフMrnkaによって"An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key"

とこの回答:私はこのエラーを取得するAn object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key

context.Entry(oldEntity).CurrentValues.SetValues(newEntity);を使用することを示唆しているが、私は本当に私と一緒にoldEntityを持っていません。誰も私にちょうど私がどのようにユーザーの1つのプロパティを更新するのか教えていただけますか?私はナッツを手に入れている。

+0

System.Data.EntityState.Modifiedを実行する代わりにselect from entityを使用して更新しないのはなぜですか? –

+2

私はコードを最初に経験していないので(答えを投稿しません)、上記の 'Db'はデータベースコンテキストを参照していますか?そうであれば、モデル第1世界とデータベース第1世界のコンテキストは、作業単位パターンに基づいて短命のオブジェクトになるように設計されています。なぜこの操作を実行するために新しいコンテキストを作成しないのですか? –

+0

@COLD TOLD:効率的にしたいから。私は自分のユーザーモデルで持っている数十のプロパティの単一のプロパティを更新するために2つのリクエストを起動したくありません。 – Jack

答えて

6

I only create once per request, once created I store it inside HttpContext.Items. Hence even though I make multiple request to DB, it uses same DbContext. Does that help?

「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(); 
} 

コードを最初に既にロードされたエンティティ(データベースへのクエリなし)からのユーザーインスタンスを取得しようと、ユーザーがまだロードされなかった場合にのみ、新しいインスタンスを作成します。

+0

スタブエンティティを作成して添付すると、これはユーザーを更新しませんか?既存のユーザーがいる場合は、変更されたユーザーとしてマークしません。 –

+1

@JohnH:添付されたユーザーに変更を加えるので、状態を変更する必要はありません.EFは変更を検出する必要があります。 –

+0

それはそうです!私は、エンティティを具体的に付け加えない限り、すべてのためにそれをやらなければならないと常に考えていました。ありがとう。 –

関連する問題