ObjectContext实例已被释放,不能再用于需要连接的操作

时间:2013-01-09 13:32:56

标签: c# asp.net linq entity-framework

public List<User> Getdata()
{
     using (var context =new  huntableEntities())
     {             
         IQueryable<User> userrecords = (context.Users.Where(x => x.RecuiteReferalId == 24));
         userrecords.ToList().ForEach(u =>
                                         {

                                          u.CurrentCompany =
                                                 u.EmploymentHistories.Where(
                                                         e => e.IsCurrent && e.MasterCompany != null).Select(
                                                             e => e.MasterCompany.Description).FirstOrDefault();
                                                 u.CurrentPosition =
                                                     u.EmploymentHistories.Where(
                                                         e => e.IsCurrent && !string.IsNullOrEmpty(e.JobTitle)).
                                                         Select(e => e.JobTitle).FirstOrDefault();
                                         });
        return userrecords.AsEnumerable().ToList();
     }          
}

我在返回语句

处获得object context disposed

我试过制作查询和方法IEnumerable,但结果是一样的。 我也试过设置延迟加载false。

猜猜我哪里错了?

3 个答案:

答案 0 :(得分:0)

在您致电ToList后,您正在执行查询,并因此将实体与上下文断开连接 - 您需要在调用{之前删除对ToList 的调用{1}}即

ForEach

此外,您无需致电userrecords.ForEach(u => ...); ,因为您的返回类型为AsEnumerable,只需在您返回查询之前致电List<User>,即

ToList

这不仅可以解决您的问题,而且效率更高,因为您现在只能访问数据库一次。

答案 1 :(得分:0)

不应该使用扩展方法,而应该使用常规的Foreach循环来获得@James所说的好处。另外,您还可以清理LINQ查询:

foreach (var u in userrecords)
{
  u.CurrentCompany = u.EmploymentHistories
                      .FirstOrDefault(e => e.IsCurrent && e.MasterCompany != null)
                      .MasterCompany.Description;

  u.CurrentPosition = u.EmploymentHistories
                       .FirstOrDefault(e => e.IsCurrent && string.IsNullOrEmpty(e.JobTitle))
                       .JobTitle;
}

让它返回userrecords.ToList()

还有一点需要注意:如果您在任何时候尝试使用User记录上的导航属性,您也可能会得到相同的异常,因为连接已经关闭,而且它是尝试延迟加载实体而没有连接(因此失败)。在这种情况下,您可以关闭延迟加载,或者您可以在此方法中实际调用该属性(不更改任何内容,只是为了读取它),以便在连接关闭之前加载它。

答案 2 :(得分:0)

当您return列表时,不确定为什么要处理上下文,但是代码中存在一个偷偷摸摸的转折,无论如何都会产生意外结果。您的ForEach声明不会改变任何内容! userrecordsIQueryable,您唯一要做的就是枚举两次:ForEachToList()语句中的return

您可以通过在开头创建列表来阻止这种情况:

List<User> userrecords = context.Users
                        .Include("EmploymentHistories.MasterCompany")
                        .Where(x => x.RecuiteReferalId == 24)
                        .ToList();
userrecords.ForEach(u => ...

Include是为了防止n + 1次查询。处置的背景现在不应成为问题。