Je suis nouveau dans Entity Framework et je développe une base de code existante. J'utilise jQuery pour transmettre les informations nécessaires au style Ajax du serveur, donc je ne peux pas utiliser TryUpdateModel()
. Voici le code:Enregistrer les modifications apportées au modèle d'entité dans la base de données
<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
est une fonction d'aide qui convertit la chaîne JSON entrant vers un objet vb.
Les choses semblent fonctionner correctement car player
se charge avec succès à partir de la base de données et playerAdminPlayer
est l'objet correct de la chaîne JSON. Cependant, quand je l'appelle PlayerAdminManager.SaveChanges()
(qui passe juste l'appel des db.SaveChanges() le résultat est toujours 0, même s'il y a un changement (pas sûr si cela est prévu).
playerAfter
était ma tentative pour voir si changements Il semble fonctionner correctement ont été effectivement enregistrés., dans ce playerAfter.FirstName
est le premier nom récemment mis à jour.
PlayerAdminManager.GetPlayerById(integer)
tire de la DB, donc je pense que, étant donné que des changements observés dans playerAfter
, que ces modifications ont été enregistrées Toutefois, lorsque je recharge la page Web (qui extrait de la base de données), les anciennes valeurs sont présentes:
des idées?
Voici quelques-unes des fonctions que je mentionne:
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
EDIT
Code conteneur:
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
Le conteneur est-il une instance statique ou mise en cache de votre DataContext? Pouvez-vous montrer le code lié à la création et au stockage de conteneurs? – wonkim00
@ wonkim00 - était-ce tout ce dont vous aviez besoin? –
Oui, c'est ce que je cherchais, mais je ne vois rien de mal. Je ne pense pas que ce soit un problème de gestion de vie DataContext: il est créé et mis en cache, et les appels suivants aux méthodes sur PlayerAdminManager utilisent l'instance mise en cache. Le suivi des modifications doit donc être actif et l'ajout de l'objet modifié ne devrait pas être nécessaire. Pardon. – wonkim00