EF5&具有导航属性的分离POCO返回null

时间:2012-11-12 23:36:32

标签: c# repository-pattern poco entity-framework-5

我遇到了一个我认为可以通过简单的理解解决的问题。我正在使用Entity Framework 5代码优先和POCO。我为所有POCO对象正确配置了所有导航属性(虚拟)。当我查询对象(PO​​CO)然后返回该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对象),但保留至少一级导航属性?我无休止地寻找一个解决方案,但我感到困惑,因为解决方案在如何做到这一点上都是相互冲突的。

---回顾---- 如下所示,如果我要将存储库中的查询更改为以下内容:

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;
    }
}

是否会返回所有的enities并且它们将包含一个非null .Parent属性,或者我指定的任何属性?

1 个答案:

答案 0 :(得分:2)

默认情况下启用延迟加载,这就是可导航属性为空的原因。延迟加载意味着在请求可导航属性之前不会加载它们。如果在请求它们时上下文消失,它们将被设置为null,因为它们无法加载。

要解决此问题,您需要禁用延迟加载或显式(并且急切地)加载所需的属性。

这个MSDN magazine article是帮助您确定最适合您的路线的好来源。