簡単な理解で解決できると思う問題があります。私は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プロパティ、または私が指定したプロパティが含まれますか?