Include() メソッドを使用して複数のエンティティ (イーガー ロード) を返すのに問題があります。RIA サービスを使用して Silverlight アプリケーションにエンティティをロードしようとしています。データ モデルは、次の関係で構成されます。
Events.ID = EventParticipants.EventID
EventParticipants.ParticipantUserID = ユーザー.ID
そのため、イベントには多数の参加者が含まれる場合があり、参加者は 1 人のユーザーです。
Event は正常にロードできますが、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)
私のデータ モデルには、さまざまなパラメーターを持つ 3 つのコンストラクター (すべて生成されます) があります。それぞれで、次のように遅延読み込みを無効にしました。
this.ContextOptions.LazyLoadingEnabled = false;
DataModel.edmx の xml 表現に注釈がありました。これは単なる生成目的だと思います...しかし、私もそれを次のように変更しました:
<EntityContainer Name="MyCrazyEntities" annotation:LazyLoadingEnabled="false">
SQL Server 2008 データベースでリレーションシップを定義しました。デザイナーはこれらを拾い上げ、モデル内のすべての関係とナビゲーション プロパティを作成しました。それらを調べると、それらは有効に見えます。インクルードステートメントのエンティティのスペルを太字で指摘すると、パスが無効であるというエラーがスローされます(またはその効果の何か)...したがって、関係が存在し、機能していると思います(そして、それらの定義を確認できますデザイナーコードなどで)。
クエリを発行する前に、すべてのフィルタリングと、特にクエリに配置した追加の結合を削除しました。これは、結合によってクエリの形状が変更されたり、Includes() が壊れたりするという問題が発生していないことを確認するためでした。人々にとって大きな問題のようです。問題を切り分けるために、この方法ですべての結合を排除しました。ジョインとインクルードの組み合わせではありません。
ドメイン サービスと RIA サービス DLL を格納する Silverlight プロジェクトを何度か再構築しましたが、設定が間違っていると思いました。私はEFでPOCOクラスジェネレーターを使用しましたが、POCOで同じ方法を含めることはできないと読んだので、それも破棄してデフォルトのエンティティジェネレーターに戻りました。
SQL Server プロファイラーを起動し、ベース クエリと includes() を使用したクエリから SQL をキャプチャしました。インクルードのデータは返されています。プロファイラーからクエリをコピーして直接発行することで、これを確認しました。クエリの簡略化されたバージョンは次のとおりです。関係は有効で、関連するすべてのデータ (参加者の名前、電話番号など) がそこにあることがわかります。
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" がありません)
インターネットで解決策を探しましたが、遅延読み込み設定、結合とインクルードの組み合わせ、または不適切なナビゲーション プロパティによって解決されなかった同じ問題を抱えている人は見つかりませんでした。
基本的なことを見逃してしまったのでしょうか。私が見逃している主要な概念はありますか?私は古い雇用主から別のプロジェクトを持っており、彼らはこれと同じ操作を実行しており、うまくいっているようです。だからきっとできると思います。私だけじゃない??
どんな助けでも大歓迎です。私は途方に暮れています。 前もって感謝します!