2010-10-12 25 views
3

我想用DataServiceQuery查詢數據庫中的單個實體。 我想加載的實體與我想要加載的其他實體的圖形有關係。 MSDN描述herehere我可以使用任一化DataServiceQuery <TElement> .Expand或DataServiceContext.LoadProperty加載我提到的實體。如何加載與WCF數據服務的二級實體關係?

也能正常工作對我實體的第一個學位的關係,但我有關係的問題裝載關係。

很顯然,我可以打電話LoadProperty所有二度關係,並遍歷所有二度集合,但我希望我能渴望負載在單個查詢整個關係圖。那可能嗎?

編輯

實際加載的二度關係不是很明顯畢竟。 以下代碼失敗(改變爲清楚起見域模型):

  var context = DataServiceReference.DataServiceContextFactory.Create(); 
      var customer = (from c in context.Customers.Expand("Orders") 
           where c.CustomerId.Equals(customerId) 
           select c).First(); 
      foreach (var order in customer.Orders) 
      { 
       context.LoadProperty(order, "Products"); 

上面的最後一行拋出InvalidOperationException異常:「上下文不是目前跟蹤實體」。 我使用自我跟蹤實體。這個錯誤可能與STE有關嗎?

我該如何加載二度關係?

解編輯

事實證明化DataServiceQuery <TElement> .Expand使用不同的路徑語法相比的ObjectQuery <Ť> .INCLUDE。前者使用斜線作爲路徑分隔符,後者使用點。任何人都可以解釋爲什麼語法不一致,我可以在哪裏找到Expand路徑語法的文檔?

回答

5

DataServiceContextFactory是你自己的類,對吧? (因爲這不是你通常實例化DataServiceContext的方式)。假設它最終創建一個正常的DataServiceContext實例,那麼加載多個級別的方式只是指定你的多個級別展開調用。因此,例如: context.Customers.Expand(「訂單/產品」) 將向您返回所有客戶,他們的訂單以及這些訂單的所有產品。 要使LoadProperty正常工作,請確保在您的DataServiceContext上將MergeOption屬性設置爲允許跟蹤的選項之一。 請注意,客戶端跟蹤與服務器端EF跟蹤無關(它在技術上是單獨計算機上的單獨代碼)。 您可以驗證的背景下,試圖調用 context.GetEntityDescriptor(myEntityInstance) 如果返回非空,上下文跟蹤的實體和LoadProperty應該工作跟蹤實體問題。

+0

是的,上下文工廠只是一個簡單的工廠類,它使用正確的URL創建上下文。我的問題在於擴展路徑使用「/」我習慣於包含哪些使用「。」在路徑中。這種不一致的路徑表示法的解釋是什麼? – Holstebroe 2010-10-13 11:29:50

+0

我試圖添加行context.MergeOption = MergeOption.OverwriteChanges;在我創建上下文之前和加載實體之前,但它的LoadProperty仍然失敗,並且context.GetEntityDescriptor(myEntityInstance)返回null。如何正確啓用跟蹤? – Holstebroe 2010-10-13 11:49:13

+0

Expand中的語法是從$ expand的URL語法中「繼承」的。在URL中,/用於分隔導航,因爲這是在URL中導航的自然方式。 – 2010-10-13 18:39:00