我有一个问题,我相信可以通过简单的理解来解决。我正在使用带有代码优先和 POCO 的 Entity Framework 5。我为我的所有 POCO 对象正确配置了所有导航属性(虚拟)。当我查询一个对象(POCO)然后返回该 POCO 作为结果时,就会出现问题。POCO 的所有导航属性都为空:
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 对象),但至少保留一级导航属性?我一直在寻找解决方案,但我很困惑,因为解决方案在如何做到这一点上相互冲突。
--- 回顾 ---- 使用下面给出的答案,如果我要将存储库中的查询更改为以下内容:
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;
}
}
这会返回所有实体,它们将包含一个非空的 .Parent 属性,或者我指定的任何属性?