2013-11-22 86 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(); 

從我可以告訴他們倆都實現我的目標。是這些比其他的更好的,或者是他們都同樣細(或錯!?)

+0

僅供參考,由於您使用了'FirstOrDefault','thing'可能是'null'。在嘗試使用'thing'之前,你需要檢查'null'。 –

+0

@JohnSaunders - thx。我編輯它以使用Single來代替。 – TTT

回答

15

第一個版本是更好,因爲

  • 它表達更好,你不要我寧願它想要跟蹤現有實體的變化
  • 它並沒有將實體附加到上下文中,而第二個版本附加並立即將其分開(這很有可能會使性能稍差)
  • 它保持關係(在這個簡單的例子中並不重要,但一般而言),同時只分離一個實體d提供您傳遞給Detach的實體本身。相關的孩子將保持聯繫,這些聯繫將以清除關係的價格出現(例如,將清空子實體的導航集合,參考導航屬性將被設置爲null),因爲EF不允許將對象圖與附屬和分離的實體。
+2

傑出的答案。謝謝。 – TTT

相關問題