.net - Entity Framework - 在结束使用后保留加载/包含的相关对象?

标签 .net entity-framework entity-framework-4 entity-relationship

我正在尝试使用如下所示的方法进行查询:

Public Shared Function listParticipationsByTeamCount(ByVal count As Integer, ByVal challenge As Challenge) As List(Of Participation)
    Dim participationList As List(Of Participation)

    If count <> Nothing And challenge IsNot Nothing Then
        Using db As New DatabaseEntities()
            participationList = db.Participations.Where(Function(x) x.TeamCount = count And x.Challenge.Id = challenge.Id).OrderByDescending(Function(x) x.TeamCount).ThenBy(Function(x) x.Team.Name).ToList()
        End Using
    End If

    Return participationList
End Function

我有一个参与表,参与团队表之间存在多对一关系,并且参与表之间存在多对多关系参与团队成员表。在我的标记页面上,当我像这样迭代列表时,我会尝试这样的操作:

<% For Each participation As Participation In participationsList%>
    <tr>
        <td><a class="external-link" href="<%= participation.Team.Website %>"><%= participation.Team.Name%></a></td>
        <td><%= participation.Percentage%>%</td>
        <td>
            <%  For Each member As TeamMember In participation.TeamMembers%>
                <%= member.Name%><br /> 
            <% Next%>
        </td>
    </tr>
<% Next%>

我收到以下错误:

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

现在我明白了,这是因为我将查询放在 using 中,并且在 End using 之后我无法获取相关对象,在查找此内容后,我尝试将查询更改为 using 语句这个:

Using db As New DatabaseEntities()
        participationList = db.Participations.Include("Team").Include("TeamMember").Where(Function(x) x.TeamCount = count And x.Team.Id = team.Id).OrderByDescending(Function(x) x.TeamCount).ThenBy(Function(x) x.Team.Name).ToList()
End Using

这不起作用。我还尝试加载实体引用,如下所示:

Using db As New DatabaseEntities()
        participationList = db.Participations.Where(Function(x) x.TeamCount = count And x.Team.Id = team.Id).OrderByDescending(Function(x) x.TeamCount).ThenBy(Function(x) x.Team.Name).ToList()
    For each part as Participation in participationList
            part.TeamReference.Load()
            part.TeamMembers.Load()
    Next
End Using

错误仍然存​​在。如何将所有这些相关对象加载到我的参与列表中,以便在我结束使用后仍然可以引用它们???我知道 EF4 现在默认执行延迟加载,但即使我显式加载相关对象,它似乎仍然不起作用。

编辑:感谢大家的所有回答,这是一个不将 TeamMembers 包含在内的复数问题,因为它是一个集合。这打破了整个查询。所以答案是:

Using db As New DatabaseEntities()
        participationList = db.Participations.Include("Team").Include("TeamMembers").Where(Function(x) x.TeamCount = count And x.Team.Id = team.Id).OrderByDescending(Function(x) x.TeamCount).ThenBy(Function(x) x.Team.Name).ToList()
End Using

最佳答案

问题似乎是您正在设置查询但未执行它。

  • 只有在 using 语句中时,您才有权访问数据库。
  • 当您实际尝试使用数据时,请求会发送到数据库。

因此,在退出 using 语句之前,您应该循环遍历数据并将其放置在域对象中。

关于.net - Entity Framework - 在结束使用后保留加载/包含的相关对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5421629/

相关文章:

c# - 编译时的目标平台/处理器

c# - GroupJoin、SelectMany、GroupBy 和 Sum

.net - FormatException 未处理 vb.net

c# - 将 int 转换为 short 的更好方法? (如果不可能则为 NULL)

.net - JSON.NET 返回未格式化的字符串

c# - 基础提供者在打开时失败/该操作对交易状态无效

c# - Entity Framework 不支持 protected 导航属性吗?

c# - Entity Framework 中的唯一约束

c# - 使用 Entity Framework 代码优先保存图像

entity-framework - 如何让 Entity Framework 仅更新在生成的 SQL 中修改的属性?