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

时间:2012-02-29 18:04:03

标签: asp.net linq entity-framework

enter image description here

我正在尝试使用以下查询查询UserMetaData以获取单个记录

 using (JonTestDataEntities context = new JonTestDataEntities())
            {
                return context.UserMetaData.Single(user => user.User.ID == id);               
            }

我收到的错误是:ObjectContext实例已被释放,不能再用于需要连接的操作。它试图为UserMetaData记录延迟加载Group。如何更改查询以防止出现此错误?

2 个答案:

答案 0 :(得分:3)

正如消息所说,你不能在函数返回后懒惰地加载它,因为你已经处理了上下文。如果您希望能够访问Group,则可以确保提前获取它。扩展方法.Include(entity => entity.NavigationProperty)就是您如何表达这一点:

using (JonTestDataEntities context = new JonTestDataEntities())
{
    return context.UserMetaData.Include(user => user.Group).Single(user => user.User.ID == id);
}

另请考虑添加.AsNoTracking(),因为无论如何您的上下文都会消失。

答案 1 :(得分:1)

您需要创建一个与结果集的签名匹配的强类型。实体框架正在创建一个匿名类型,并且在using语句超出范围之后处理匿名类型。

因此,分配强类型可以完全避免这个问题。我建议创建一个名为UserDTO的类,因为在这种情况下你真的要创建一个数据传输对象。专用DTO的好处是您只能包含必要的属性,以使您的响应尽可能轻松。