Запрос сущности не обновляется для каждого правильно - PullRequest
0 голосов
/ 09 апреля 2011

У меня есть следующий код:

  ' Now retabulate the current occupancy.
        For Each row In assignments
            Try
                Dim assignment As Integer = row.room
                Dim student_id As String = row.id
                Dim update_occupancy = (From p In dbContext.Beds _
                                        Where p.occupant = 0 _
                                        Where p.room = assignment _
                                        Select p).FirstOrDefault
                update_occupancy.occupant = student_id

            Catch ex As Exception

            End Try

        Next
        dbContext.SaveChanges()

В этом сегменте я перебираю текущие задания и, когда кровать не занята (= 0) и комната равна текущему ученику, я вставляю ученика в эту комнату.

Проблема в том, что update_occupancy, похоже, всегда остается неизменным. Например, у меня может быть четыре кровати (ID 101, 102, 103, 104), первый раз, когда ученику нужно назначить 101, следующему ученику - 102, следующему - 103 и так далее. Но это просто перезаписывает первый снова и снова. Я не могу поместить dbContext.SaveChanges () внутри For Each, он ломается. Мысли

1 Ответ

1 голос
/ 09 апреля 2011

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

Ваше исключение происходит, только если assignmentsПеречислил результат запроса.Если вы хотите избежать этого исключения, просто вызовите ToList в запросе.

Тем не менее, я бы подумал об алгоритме и попытался бы загрузить кровати заранее.Для этого требуется один запрос, чтобы получить назначения, и один запрос + одно обновление для каждой кровати.Если ваши назначения возвращают 1.000 строк, вам нужно будет сделать 1.000 запросов на койки.Вы не избежите 1000 обновлений, потому что EF не поддерживает пакетную обработку команд.Существует также решение о том, что является транзакцией в вашем алогрите.Это обновление односпальной кровати или обработка всех загруженных assignments?На основании этого решения вы также можете подумать о своем алгоритме.

Кстати.если assignments - это запрос, он, скорее всего, может быть переписан в какое-то соединение с койками, поэтому вам не нужно будет выполнять подзапросы в цикле.

...