2

簡単な理解で解決できると思う問題があります。私はEntityFramework5を最初にコードとPOCOで使用しています。すべてのPOCOオブジェクトに対して、すべてのナビゲーションプロパティが適切に構成(仮想)されています。この問題は、オブジェクト(POCO)を照会し、その結果としてそのPOCOを返すときに発生します。POCOのすべてのナビゲーションプロパティはnullになります。

class PocoParent  { // all of these are properties (get/set)
    public int Id;
    public string ParentProperty;
    public virtual PocoChild NavProperty;
}
class PocoChild {
    public int Id;
    public int ParentId;
    public string Name;
    public virtual PocoParent Parent;
}

クエリを処理するリポジトリクラス内:

IEnumerable<PocoChildren> GetAllChildrenFor(int parentId) {
    using(Context db = new Context()) {
        var pcs = db.PocoParents.Where(p => p.Id == parentId);
        return pcs;
    }
}

次に、リポジトリを使用します。

...
var children = repo.GetAllChildrenFor(queriedParent.Id);
...

次に、リポジトリからの結果を使用します。ここでエラーが発生します。

...
foreach(child in children) {
   if(child.Parent.NavProperty == "null") {  !!! Exception: child.Parent ObjectContext already disposed
   }
}
...

ObjectContextを破棄して(POCOオブジェクトをデタッチするために)、少なくとも1レベルのナビゲーションプロパティを保持するにはどうすればよいですか?私は解決策を際限なく探してきましたが、解決策がすべてそれを行う方法について互いに矛盾しているため、私は困惑しています。

---要約----以下の答えで、リポジトリ内のクエリを次のように変更した場合:

IEnumerable<PocoChildren> GetAllChildrenFor(int parentId) {
    using(Context db = new Context()) {

        var pcs = db.PocoParents.Include(p => p.Select(prop => prop.Parent).Where(p => p.Id == parentId);

        return pcs;
    }
}

それはすべてのエンティティを返し、それらにはnull以外の.Parentプロパティ、または私が指定したプロパティが含まれますか?

4

1 に答える 1

2

遅延読み込みはデフォルトで有効になっているため、ナビゲート可能なプロパティはnullです。遅延読み込みとは、ナビゲート可能なプロパティが要求されるまで読み込まれないことを意味します。また、要求されたときにコンテキストがなくなった場合、ロードできないため、nullに設定されます。

これを回避するには、遅延読み込みを無効にするか、必要なプロパティを明示的に(そして熱心に)読み込む必要があります。

このMSDNマガジンの記事は、どのルートが最適かを判断するのに役立つ優れた情報源です。

于 2012-11-12T23:44:06.927 に答える