具有存储库/工作单元的实体框架:导航属性在处理上下文后抛出异常

时间:2012-09-27 13:09:03

标签: entity-framework repository-pattern unit-of-work

我使用EF与存储库模式和工作单元。我正在拉一个具有内部对象就业的对象。 以下是如何构造类:

    class Person
    {
       Employment employments;
    }

   class Employment
   {
          int ID {get;set;}
          string Employer {get;set;}
   }

启用了延迟加载。 以下是我如何获取Person对象:

     Person p;
     using (unitOfWork = new UnitOfWork())
     {
        p=unitOfWork.PersonRep.Single(s => s.Id== Id);
     }
   return p;

在此代码之外,无法访问p.employments。这种架构的最佳实践是什么?为什么导航属性不会持续存在?

1 个答案:

答案 0 :(得分:0)

导航属性导致错误的原因是因为您在导航属性加载之前处置了上下文。

如果你想一想发生了什么:

  • 您正在打开数据库连接,并检索人物对象。
  • 然后,关闭此连接。
  • 接下来,你问问对象,谁是你的雇主?它会尝试返回到您的数据库,但连接不存在而且会中断。

您需要使用include急切地为您的人员加载雇主,在您的上下文中,它会像context.Persons.Include(p => p.employments)这样很难说,因为您没有发布该代码。

或者,让您的数据库连接保持更长时间。访问该人的雇主信息似乎都将在同一单元中处理,因此您可以考虑在整个方法中保持您的工作单元存活。