Entity Framework - Сохранять загруженные / включенные связанные объекты после завершения использования? - PullRequest
6 голосов
/ 24 марта 2011

Я пытаюсь получить запрос в методе, который выглядит следующим образом:

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

У меня есть таблица Участие , которая имеет отношение многие к 1 между таблицей Участие и Команда , и связь многие ко многим между Участие и TeamMember Таблица. На моей странице разметки я пытаюсь что-то вроде этого, когда я перебираю список следующим образом:

<% 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%>

Я получаю следующую ошибку:

Экземпляр ObjectContext был удален и больше не может использоваться для операций, требующих подключения.

Теперь я понимаю, что это потому, что я помещаю запрос в использование, и после End 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

Ошибка все еще сохраняется. Как я могу загрузить все эти связанные объекты в мой ParticipationList, чтобы я мог ссылаться на них еще после завершения использования I ??? Я знаю, что 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

Ответы [ 2 ]

3 голосов
/ 24 марта 2011

Проблема заключается в том, что вы настраиваете запрос, но не выполняете его.

  • У вас есть доступ к базе данных только тогда, когда вы находитесь внутри оператора using.
  • Запрос отправляется в базу данных, когда вы действительно пытаетесь использовать данные.

Таким образом, вы должны перебрать свои данные и поместить их в объект домена перед выходом из оператора using.

2 голосов
/ 25 марта 2011

В третьем блоке кода вы включаете TeamMember. Однако из того, что я вижу во втором блоке кода, ваши навигационные свойства являются множественными, поэтому попробуйте включить TeamMembers.

...