4

我無法使用Include()方法返回多個實體(熱切加載)。我正在嘗試使用RIA服務加載Silverlight應用程序中的實體。數據模型包含以下關係:使用RIA服務域服務不加載包含()在EF4中!

Events.ID = EventParticipants.EventsID
EventParticipants.ParticipantUserID = Users.ID

因此,一個事件可以有很多參與者和參與者正好是1用戶。

我可以加載事件就好了,但我不能得到什麼出由include()語句中指定的子關係。

當我加載一個事件時,我試圖拉入所有EventParticipants及其相關的用戶記錄(使用加載加載)。在我的域名服務,我有以下幾點:

public IQueryable<Event> GetEvents() 
    { 
     return this.ObjectContext.Events     
        .Include("EventParticipants") 
        .Include("EventParticipants.User"); 

    } 

然後我拿的IQueryable時返回,並使用在客戶端上,像這樣我的域背景信息加載:

DomainContext.Load(DomainContext.GetEventsQuery(), LoadOperationCompleted, true); 

(通常我會過濾這可是我的一切簡化到找到問題的心臟)

在我LoadOperationCompleted我有2路,我用它來查看是否返回的參賽者,但我從來沒有收到任何參與者查詢回來。 (在數據庫中,我有242個活動定義......所有這些都參加)

private void LoadOperationCompleted(LoadOperation lo) 
    { 

     if (lo.Error != null) 
     { 
      Debugger.Break(); 
      lo.MarkErrorAsHandled(); 
     } 

     foreach (Event item in lo.Entities) 
     { 

      foreach (var particpant in item.EventParticipants) 
      { 
       Debug.WriteLine("{0} {1}", particpant.User.First, particpant.User.Last); 
      } 

     } 

    } 

我還修改了上面的代碼(見下文),通過原域範圍內,而不是實體的集合旋轉該通過加載操作參數傳遞給無效。 (事件在那裏,孩子們都沒有)

foreach (Event item in DomainContext.Events) 

在我的數據模型中,有三個構造函數(所有生成的)參數變化。在每個我已禁用延遲加載,如下所示:

this.ContextOptions.LazyLoadingEnabled = false; 

DataModel.edmx的XML表示中有一個註釋。我認爲這只是爲了生成目的...但我也是這樣改變的:

<EntityContainer Name="MyCrazyEntities" annotation:LazyLoadingEnabled="false"> 

我已經在我的SQL Server 2008數據庫中定義了關係。設計師挑選了這些,並在我的模型中創建了所有的關係和導航屬性。檢查他們,他們似乎有效。如果我在包含語句中強調實體的拼寫,它會拋出一個錯誤,指出該路徑無效(或其他影響)......所以我相信這些關係存在並且是功能性的(我可以看到它們的定義在設計師的代碼和whatnot)。

我已經刪除了所有的過濾條件,特別是在發佈它之前我已經在查詢中添加了額外的連接。這是爲了確保我沒有遇到連接更改查詢形狀並破壞Includes()的問題。似乎是人們面臨的一個大問題,我已經以這種方式排除了所有聯接來隔離問題。它不是加入和包含的組合。

我已經重建了我的Silverlight項目,這些項目包含了域服務和RIA服務DLL,有幾次我認爲我有一些設置錯誤。我已經使用EF的POCO類生成器,但隨後讀取您不能包含POCO相同的方式...所以我也廢除了它,並返回到默認的實體生成器。

我啓動了SQL Server分析器,並從基本查詢中捕獲了SQL,並使用了Includes()。包含的數據將返回。我通過複製探查器的查詢並直接發佈來驗證這一點。查詢的簡化版本如下。的關係是有效的,我可以看到所有的相關數據是存在的(即參加者姓名,電話號碼等)

SELECT 
'trimmed fields for brevity>' 
FROM (SELECT 
    'trimmed fields for brevity>' 
    CASE WHEN ([Join1].[ID1] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1] 
    FROM [dbo].[Events] AS [Extent1] 
     LEFT OUTER JOIN (SELECT 'trimmed fields for brevity>' 
     FROM [dbo].[EventParticipants] AS [Extent2] 
     INNER JOIN [dbo].[Users] AS [Extent3] ON [Extent2].[ParticipantUsersID] = [Extent3].[ID]) AS [Join1] ON [Extent1].[ID] = [Join1].[EventsID] 
) AS [Project1] 
ORDER BY [Project1].[ID] ASC, [Project1].[C1] ASC 

但是,在返回的實體時,該Event.EventParticipants EntityCollection是空的。可悲的是。令人沮喪。痛苦。 (我沒有「ly」s)

我已經搜索了互聯網尋找解決方案,但還沒有找到任何人有相同的問題,沒有通過lazyloading設置解決,結合和包含或不適當的組合導航屬性。

我剛剛錯過了一些基本的東西?是否有一個我缺少的重要概念?我有另一個老僱主的項目,他們在這裏進行同樣的操作,看起來很有效。所以我相信它可以做到。只是不是我?

任何幫助,非常感謝。我不知道該怎麼做。 提前致謝!

回答

3

您是否嘗試過使用composition/include屬性爲模型上的集合賦予屬性? 這告訴RIA服務序列化entitycollection爲好,繼承人幾個環節讓你在正確的道路

A guide through WCF RIA Services attributes

WCF RIA Services Part 5 - Metadata and Shared Classes

Composition Support in RIA Services

+1

這是問題了!我在這裏找到Tim Heuer的博客:[RIA Services and relational data](http://timheuer.com/blog/archive/2010/01/05/master-details-with-ria-services-and-includedresults.aspx )。我實際上只是修復了它,並且當我看到你釘了它以後又回來更新了這篇文章。 我早些時候已經閱讀過關於這方面的內容,但認爲(不完整),.Include(「Path」)和include屬性做了同樣的事情。 添加屬性解決了問題。 謝謝你的迴應! – Michael 2011-03-02 07:25:01

+0

不是一個問題很高興它排序:) – 2011-03-02 09:22:26