2011-01-28 7 views
8

DbContextを使用し、リポジトリパターンを使用してCTP 5で更新操作を行う方法はありますか?それ以前はEF 4.0で、以下のようにすることができました。エンティティフレームワークCTP 5 - リポジトリパターン - 更新中

_context.Customers.AddObject(item); 
_context.ObjectStateManager.ChangeObjectState(item, System.Data.EntityState.Modified); 

EFが「切断された」エンティティを簡単に更新する方法を提供しない理由は何かありますか?私は、DBを照会し、すべてのプロパティをクエリから返されるオブジェクトにコピーしたくありません。つまり、EFにはエンティティを取り込む更新メソッドが必要です(Addメソッドと同様)。エンティティキーがすでにデータベースに存在する場合は、エンティティを現在の値で更新します。つまり、なぜ「Attach」をしてから、すべてのプロパティを添付オブジェクトにコピーする必要がありますか。私には、「切断された」オブジェクトが既に存在するときに更新するだけのエンティティのすべてのプロパティをコピーするのは冗長なようです。

答えて

8

私はあなたがまだCTP5 DbContextで切断エンティティを更新するために、あなたのコードの例と同様の方法を実行することができると信じて:

これは、もちろん、すべての完全なUPDATE文を作成し、生成されたSQLを見てみると
_dbContext.Customers.Add(item); 
DbEntityEntry entry = _dbContext.Entry(item); 
entry.State = EntityState.Modified; 

_dbContext.SaveChanges(); 

EFはデータベース内の現在の状態がわからないため、実際に変更されなかったプロパティを含む顧客オブジェクトのプロパティ。

DbEntityEntry entry = _dbContext.Entry(_dbContext.Customers.Find(item.ID)); 
entry.CurrentValues.SetValues(entity); 

_dbContext.SaveChanges(); 

(あなたがあなたの顧客にキーIDを持って、ここと仮定:あなたはそれを避けたい場合は、私が推測するこの方法を行うことができ、更新前に、データベース内の現在の状態を取得するより他に方法はありません

これは、実際にデータベースの状態と比較して変更されたプロパティのみを含むSQL更新文を作成します。私は、2番目の方法が必ずしも追加の選択ステートメントのためにパフォーマンスの低いオプションであるかどうかはわかりません。オブジェクトタイプが大きいがプロパティの変更がほとんどない場合、すべてのフィールドで完全な更新ステートメントを送信するオーバーヘッドは、selectステートメントと、更新に本当に必要なフィールドのみを持つ「小さな」更新ステートメントよりも大きくなる可能性があります。 (しかし、それは推測だけですが、私はSQL Serverの専門家ではありません)

+0

これはまさに私が探していたものです。ありがとう。この点について私は、http://stackoverflow.com/questions/4167033/entity-framework-poco-with-foreign-keysのコメントで尋ねられる別の質問があります。どう考えているか教えてください。 "EF CTP 5と" Ado.net DbContext generator "でDbContextを使用するとどうしますか?Fixupコードはありませんので、DirectorIdを設定するとDirectorがクリアされません。DirectorIdを設定した後、常にmovie.Director =オプションのみ? – Jonna

+0

申し訳ありませんが、私は本当に知らない、私は今までDbContextジェネレータを使用していない。 – Slauma

+0

目次:CTP5についての満足のいく回答が得られない場合は、EFプレリリースフォーラムがお勧めします。http://social.msdn.microsoft.com/Forums/en-US/adonetefx/threads – Slauma

関連する問題