環境
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 つを続行する必要がありますか? より良い、よりクリーンなソリューションを望んでいたからです。
お時間をいただきありがとうございます
イアン