7

環境

Framework 4.0 で Entity Framework 5 を使用しています。(これは、実際に EF 4.4 を使用していることを意味します)。N 層アプリケーションで作業しているため、エンティティとして STE (Self Tracking Entities) を使用します。EF はゲームの後半で導入されたため、データベース駆動型のアプローチを使用します。

環境

お互いにナビゲーション プロパティを持つ 2 つのエンティティがあります。(EntityA には EntityB へのナビゲーション プロパティがあり、EntityB には EntityA へのナビゲーション プロパティがあります)。リレーションは「EntityA > One-to-Many > EntityB」です。LINQ 式を介して子エンティティをロードする場合は、INCLUDE (STE => Eager Loading) を使用する必要があります。これは、すべてのデータを複数の層に渡すためです。

コード

EntityA とその EntityB の子を呼び出すコードを次に示します。

using (var ctx = new MyEntities())
{
     var result = (from s in ctx.EntityA.Include("EntityB")
                   where s.Id = 11111
                   orderby s.TimeUpdated descending 
                   select s)
               .Take(10)
               .ToList();
     return result;
}

エラー

System.StackOverflowException {現在のスレッドがスタック オーバーフロー状態にあるため、式を評価できません。}

「INCLUDE」を削除してもエラーはありません。理由は単純だと思います。EntityA に子レコード EntityB をロードしたい、EntityB レコードはその親 EntityA を毎回ロードしたい、そして EntityA をロードしたい...ここでの無限ループは誰もが理解していると思います。

私の解決策または代替案

  • EDMX ファイルに移動し、EntityB の EntityA のナビゲーション プロパティを削除します。EntityB を自由に使用できる一方で、EntityA に関するデータをロードしたい場合。別の DB リクエストを行う必要があり、2 つの異なるオブジェクトを階層を介して渡す必要があります。
  • インクルードの使用を避け、EntityA を個別にロードし、EntityA を参照する EntityB の Navigation プロパティにプッシュします。

質問

私の状況でこれを修正するためのより良い代替手段またはアプローチはありますか? 私が提案した代替案の 1 つを続行する必要がありますか? より良い、よりクリーンなソリューションを望んでいたからです。

お時間をいただきありがとうございます

イアン

4

3 に答える 3

1

EF 5 (Visual Studio 2012) で問題を再現しようとしましたが、エラーは発生しません。あなたの問題を引き起こす可能性のあるものは他にありますか?シンプルな POCO セットアップで動作していますか?

また、STE はかなりの頭痛の種になる可能性があることにも注意したいと思います。私は以前STEと仕事をしたことがありますが、今は本当に避けようとしています。本当に STE を使用しますか?

STE を使用する代わりに、単純な古い DTO を使用できます。リッチ ドメイン モデルをサーバーに保持し、必要なデータのみをクライアントに送信します。このようにして、ユースケースごとに最小限のデータで調整された DTO を作成できます。

于 2012-10-09T09:51:26.047 に答える
0

私はあなたに「あなたは使うことができます」と言うためにここに来ましたIncludeが、明らかにこの状況では役に立ちません。

私が通常インターネットで読んでいるように、無限ループのケースが疑われる (またはある) 場合の回避策がいくつかあります。

  1. 子を手動で使用してロードすることにより、ロード操作を使用できます。foreach
  2. それ自体が再帰クエリである (そしてそのエンティティを使用する)データベース ビューを作成できます。
于 2012-10-02T11:52:35.203 に答える
0

これを見る

ただし、アップデート 4 がインストールされていますが、まだデバッグできません。

于 2013-12-05T16:04:04.553 に答える