我無法使用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設置解決,結合和包含或不適當的組合導航屬性。
我剛剛錯過了一些基本的東西?是否有一個我缺少的重要概念?我有另一個老僱主的項目,他們在這裏進行同樣的操作,看起來很有效。所以我相信它可以做到。只是不是我?
任何幫助,非常感謝。我不知道該怎麼做。 提前致謝!
這是問題了!我在這裏找到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
不是一個問題很高興它排序:) – 2011-03-02 09:22:26