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

时间:2011-09-18 20:45:52

标签: asp.net entity-framework

这没有任何意义。我正在运行的查询如下所示。查询的结果是数据绑定到表单。

    public Message GetMessage(Guid authorizationKey)
    {
        using (MyEntities context = new MyEntities())
        {
            var result = (from message in context.Messages
                              .Include("Attachments")
                              .Include("Authentication")
                          join authentication in context.Authentications on message.Authentication.AuthenticationId equals authentication.AuthenticationId
                          where authentication.AuthorizationKey == authorizationKey
                          select message).FirstOrDefault();

            return result;
        }
    }

奇怪的糟糕:如果我提出一个断点,逐步执行查询和数据绑定一切正常。我删除断点后不会加载我的身份验证导航属性。有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:3)

包含和选择不能一起使用。

您告诉DataContext返回仅包含消息的消息变量(即使您在context.Messages对象上有include语句)。解决这个问题的两种方法是:

1)项目消息,附件,在选择语句中对POCO对象进行身份验证

        var result = (from message in context.Messages 
                          .Include("Attachments") 
                          .Include("Authentication") 
                      join authentication in context.Authentications on message.Authentication.AuthenticationId equals authentication.AuthenticationId 
                      where authentication.AuthorizationKey == authorizationKey 
                      select new MessageWithNavigations()
{
Message = message,
Authentication = message.Authentication,
Attachments = message.Attachments,
}).FirstOrDefault(); 

        return result; 

2)在整个可查询

中使用流畅的符号
var result = context.Messages
    .Include("Attachments")
    .Include("Authentication")
    .Where(m => m.Authentication.AuthorizationKey == authorizationKey)
    .FirstOrDefault();

#1的问题在于,您将无法对可以触发查询的对象实例(如导航)执行任何操作,也无法编辑这些对象上的任何属性。投影仅为您提供基本上只读的对象。

使用#2,如果AuthorizationKey是唯一值/主键,最好使用.SingleOrDefault而不是FirstOrDefault。

问题的要点是在同一个IQueryable对象中使用include with select本质上会混淆查询构建器表达式树,它会选择忽略你的include语句。