2011-11-11 6 views
0

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 
+0

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

+0

@ wonkim00 - était-ce tout ce dont vous aviez besoin? –

+0

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

Répondre

0

se trouve que je travaillais avec un non statique (partagé) Container. I avait 2 Manager classes qui ont tous deux hérité d'une classe BaseManager étaient les Container a été défini. J'exécutais la commande de requête dans un Manager et enregistrais dans un autre.

Doh!

Questions connexes