2011-12-14 252 views
4

當我使用實體框架時,我想查詢上下文中的記錄並將其添加到具有相同模式的另一個上下文,在查詢出記錄後,我將它從的背景下,但相關的實體都走了,有什麼辦法解決它?實體框架分離實體和相關實體

在此先感謝!

+0

你是什麼意思*「相關實體全部離開」*? – Yuck 2011-12-14 17:53:26

回答

8

這是「按設計」。 EF只能逐個分離實體,但同時EF不支持由連接和分離的實體組成的對象圖。正因爲如此,當你分離實體時,它將把所有的關係都打破到附加對象圖的其餘部分。目前不支持分離整個對象圖,但您可以在Data UserVoice上投票支持此功能。

作爲解決方法,您可以關閉上下文的延遲加載,使用@CodeWarrior描述的加載加載來加載您需要傳遞給其他上下文的準確數據。一旦你有數據加載序列化他們流和立即反序列化他們對象圖的新實例。這是如何對已分離的實體圖進行深度克隆的方式,但所有關係都完好無損(需要關閉延遲加載,否則序列化將加載所有其他導航屬性,從而導致預期更大的對象圖)。唯一的要求是您的實體必須由您選擇的序列化程序進行序列化(注意循環引用通常需要一些特殊處理或實體的附加屬性)。

3

你問的是如何加載子實體?如果是這樣,您可以使用.Include方法進行急切的加載。給定一個Person類和那裏的人有******中國的集合類******中國,你可以做到以下幾點:

List<Person> People = db.People.Where(p => p.Name = "Henry") 
           .Include("PhoneNumbers") 
           .ToList(); 

或者你可以做所謂的顯式加載在這裏裝載的實體和撥打.Load方法在你想要加載的子和相關實體的集合上。一般來說,當你沒有啓用LazyLoading時,你會這樣做(並且LazyLoading在4.0+中默認啓用,在以前的版本中不記得)。

無論您如何查詢和加載它們,您都必須將要附加到不同上下文的實體分離。

這是一個很不錯的MSDN article on loading entities的鏈接。

+0

感謝您的回覆! – James 2011-12-15 03:11:44

+0

沒問題。請記住投票支持你的帖子。 – CodeWarrior 2011-12-15 05:53:56