Сохранить изменения модели Entity в базе данных - PullRequest
0 голосов
/ 11 ноября 2011

Я новичок в Entity Framework и расширяю существующую кодовую базу.Я использую jQuery для передачи необходимой информации обратно в стиль сервера ajaxy, поэтому я не могу использовать TryUpdateModel().Вот код:

<HttpPost()>
    Function UpdateRoster() As JsonResult
        Dim model As New Models.ViewModels.PlayerAdmin

        Dim jsonString As String = Request.Form("json")

        model = Deserialise(Of Models.ViewModels.PlayerAdmin)(jsonString)

        For Each playerAdminPlayer As Models.ViewModels.PlayerAdminPlayer In model.Roster
            Dim playerToTeam As New DAL.PlayersToTeam
            Dim player As DAL.Player = PlayerAdminManager.GetPlayerById(playerAdminPlayer.PlayerId)
            player.FirstName = playerAdminPlayer.FirstName
            PlayerAdminManager.SaveChanges()
        Next playerAdminPlayer


        Dim playerAfter As DAL.Player = PlayerAdminManager.GetPlayerById(model.Roster.First.PlayerId)

        Return Json(New With {.success = False, .message = playerAfter.FirstName})

    End Function 

Deserialise - вспомогательная функция, которая преобразует входящую строку JSON в объект vb.

Кажется, что все работает нормально: player успешно загружается из БД, а playerAdminPlayer является правильным объектом из строки JSON.Однако, когда я вызываю PlayerAdminManager.SaveChanges() (который просто передает вызов db.SaveChanges (), результат всегда равен 0, даже если есть изменение (не уверен, ожидается ли это).

playerAfterбыла моя попытка увидеть, действительно ли изменения были сохранены. Кажется, что это работает правильно, в том, что playerAfter.FirstName это недавно обновленное имя.

PlayerAdminManager.GetPlayerById(integer) извлекается из БД, так что я думаю, чтопоскольку в playerAfter наблюдаются изменения, эти изменения были сохранены в БД. Однако, когда я перезагружаю веб-страницу (которая извлекается из БД), старые значения уже есть.

Есть идеи?

Вот некоторые из упомянутых мной функций:

Function GetPlayerById(ByVal Id As Integer) As DAL.Player
        Return Container.Players.Where(Function(o) o.PlayerId = Id And o.IsVisible = True).SingleOrDefault
    End Function

Sub SaveChanges()
        Dim numberOfChanges As Integer = Container.SaveChanges()
        Debug.WriteLine("No conflicts. " & numberOfChanges.ToString() & " updates saved.")
    End Sub

РЕДАКТИРОВАТЬ

Код контейнера:

 Private _Container As DAL.LateralSportsContainer
    Protected ReadOnly Property Container As DAL.LateralSportsContainer
        Get
            If _Container Is Nothing Then
                Dim connStr As New System.Data.EntityClient.EntityConnectionStringBuilder
                connStr.ProviderConnectionString = Web.Configuration.WebConfigurationManager.ConnectionStrings("ApplicationServices").ConnectionString
                connStr.Metadata = "res://*/Lateral.csdl|res://*/Lateral.ssdl|res://*/Lateral.msl"
                connStr.Provider = "System.Data.SqlClient"
                _Container = New DAL.LateralSportsContainer(connStr.ConnectionString)
            End If

            Return _Container
        End Get
    End Property

1 Ответ

0 голосов
/ 15 ноября 2011

Оказывается, я использовал нестатический (общий) Container. У меня было 2 Manager класса, которые оба унаследовали от класса BaseManager, которые были определены как Container. Я выполнял команду запроса в одном Manager и сохранял в другом.

Doh!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...