2011-10-26 20 views
1

我正在使用WCF Dataservice/EF 4.1和一個WPF客戶端應用程序。 這是我的問題更簡單的形式。可以說我查詢客戶:我可以在已跟蹤的實體上「展開」其他數據嗎?

var query = (from o in ServiceRef.Clients.Expand("Addresses,PhoneNumbers,EmailAddresses") 
         where o.FirstName.ToLower().Contains(sf) || 
          o.LastName.ToLower().Contains(sf) || ... 
         orderby o.LastName 
         select o).Take(100); 

這是我需要身份的客戶。然而,在這條道路上,我很想看到評論,購買歷史或其他相關實體在第一個查詢中不是「展開」。如果我再次查詢,使用相同的ServiceRef上下文,我永遠不會得到「評論」擴大。

我猜這跟上下文有關,發現'Client'實體已經被跟蹤,因此沒有對服務執行新的查詢。

現在有些帖子說,一個人不應該在這麼長時間內保留一個DBContext,而我完全不同意。這是一個簡單的主/細節方案。爲每個「詳細信息查詢」創建一個新的上下文以獲取附加數據似乎有些不妥。有沒有辦法強制EF「重新加載」實體以獲得更多數據?

我當然可以擴展我在初始查詢中需要的每個附加實體。但是,我爲每個搜索結果提供了大量的數據。其中95%永遠不會被使用。

要清楚。我所要求的更多是「最佳實踐」問題。中間有路嗎?在所有時間擴展(...)所有數據之間<>始終創建新的上下文。有沒有一種方法可以根據需要加載額外的數據。

Thanx,Andreas

回答

1

您的問題有兩個部分。

如何獲得更多數據?

  • 您可以使用ServiceRef.Clients.Expand("Comments")在初始查詢,但它顯然是你不想要的東西 - 這就是所謂的預先加載
  • 或者您可以使用ServiceRef.LoadProperty(client, "Comments")來填充只爲單一客戶的意見 - 這可能是稱爲顯式加載

上下文應該存活多久?

這取決於。正確的做法確實是保持上下文儘可能短,但並不意味着在每次操作後關閉上下文。上下文應作爲工作單元使用,所有相關操作應在同一個上下文實例上運行。在WPF/WinForm應用程序的情況下,它意味着上下文確實可以長時間生活 - 通常與某種形式/演示者/等配對。您不應該在多個不相關的表單中使用相同的上下文,也不要形成單一的工作單元/邏輯操作(同一工作單元中的對象一起操作和保存)。

+0

謝謝Ladislav指着我在LoadProperty()。我從來沒有理解到現在爲止。在上下文的生命週期部分,我不得不說,我發現自己經常調整工作單元的「範圍」,主要是一旦我實現了save()。 Thanx – Andreas

+0

只是想知道,所有跟蹤的EF,這不是很好/可能有這種行爲內置...如果已經跟蹤,但不是與所有屬性 - >加載缺少的屬性 – Andreas

相關問題