ADO.NET Entity Framework に苦労しています。これは私のER図です:
--------------------- ----------------- ---------------
| GrandParentEntity |<-------| ParentEntity |<-------| ChildEntity |
+-------------------+ 1 N +---------------+ 1 N +-------------+
| Id | | Id | | Id |
--------------------- | GrandParentFk | | ParentFk |
----------------- ---------------
オブジェクト コンテキストの有効期間について質問があります。次のようにデータをリクエストするとします。
public static List<MyParentEntity> GetMyParentEntity()
{
using (var context = new MyObjectContext(blablabla...))
{
var resultSet = from e in context.MyParentEntitySet select e;
return resultSet.ToList();
}
}
すべての親エンティティのリストを取得します。しばらくして (数時間?)、ユーザーはどれを検査するかを決定します。(その間、エンティティ オブジェクトはアプリケーションのいくつかの層を通過しました。) 次に、レコードのすべての詳細をロードする必要があります。
public static void LoadChildren(MyParentEntity pEntity)
{
using (var context = new MyObjectContext(blablabla...))
{
pEntity.GranParentEntityReference.Load();
pEntity.ChildEntites.Load();
}
}
これは、MyParentEntity オブジェクトがそれを作成したオブジェクト コンテキストへの接続を失ったため、ObjectDisposedException につながります。これを処理するには、いくつかの可能性があります。
1) MyObjectContext の同じインスタンスを常に使用でき、それを閉じることはありません。これは大量のメモリの浪費につながります。
2)「(コンテキスト)を使用する」ブロックを離れるたびに、すべてのエンティティオブジェクト(およびその子エンティティと親エンティティ)を手動で Detach() できます。そして、新しい「using(context)」ブロックに入るたびにそれらを Attach() できます。多くの努力につながります。(私の意見では、フレームワークは労力を増やすのではなく減らすべきです。)
3)新しい「using(context)」ブロックに入るたびに、各エンティティをリロードしてから破棄します。SQL Server の (不必要な) 負荷が増加し、メモリも浪費します。
4) アプリケーションの起動時に、すべての詳細、すべての参照、すべての参照のすべての参照、およびそれらの参照の参照をロードできます。(議論はありません、これは本当にばかげています!)
5) ... (オプションを忘れましたか?)
ここで、あなたへの大きな質問: どの方法を選択すればよいですか? 私が見ていない別の方法はありますか?それとも、フレームワークの精神を完全に誤解していましたか?
前もって感謝します
更新: Windows フォーム アプリケーションです。