2013-11-22 11 views
10

私の目標は、既存のエンティティをコピーし、わずかに変更して、変更したバージョンを挿入することです。私は彼らの両方が私の目標を達成している伝えることができるものから、エンティティフレームワーク:デタッチとAsNoTrackingの違い

var thing = context.Things.Where(x => x.SomeID == someid).AsNoTracking().Single(); 
thing.AnotherID = 1234; 
context.Things.AddObject(thing); 
context.SaveChanges(); 

var thing = context.Things.Where(x => x.SomeID == someid).Single(); 
context.Detach(thing); 
thing.AnotherID = 1234; 
context.Things.AddObject(thing); 
context.SaveChanges(); 

私は両方が動作するように表示される2つの異なる方法を試してみました。他よりもこれらの優れたの1、またはそれらの両方が均等に罰金(または間違った!?)

+0

FYI、 'FirstOrDefault'を使用しているので、' thing'は 'null'になる可能性があります。 'thing'を使う前に' null'をチェックする必要があります。 –

+0

@JohnSaunders - thx。私は代わりにSingleを使うように編集しました。 – TTT

答えて

15

最初のバージョンは優れているであり、それはあなたがいないことを良く表して

  • ので、私はそれを好むだろうそれは(ほとんどの場合も、わずかに悪化した性能を持つことになります)、第2版が添付しながら、最初の場所でコンテキストにエンティティをアタッチし、その後すぐにそれを切り離していない既存のエンティティ
  • の変化
  • を追跡したいです関係を維持します(この単純な例では問題ありませんが、一般的に)。 Detachに渡すエンティティ自体をエタチェします。関連する子どもは、関係がクリアされるという価格に付随する添付されたままになります(たとえば、子エンティティのナビゲーションコレクションは空になり、参照ナビゲーションプロパティはnullに設定されます)。接続されたエンティティと分離されたエンティティ。
+2

優れた答え。ありがとう。 – TTT

関連する問題