2012-12-18 1 views
1

pas que je suis relativement nouveau à cela, mais je suis encore un peu gêné car cela devrait vraiment être simple ...MVC 4, 5 EF SaveChanges ne base de données mise à jour

Tout ce que je suis en train de faire est mise à jour une ligne existante dans une table de base de données. J'utilise d'abord le code EF (5 je crois).

Pour MVC 3 J'ai utilisé cette approche (qui a travaillé):

ReportCommon reportcommon = db.ReportCommon.Single(r => r.ReportCommonId == id); 
reportcommon.IP = StaticUtilities.GetIPAddress(); 
db.ObjectStateManager.ChangeObjectState(reportcommon, EntityState.Modified); 
db.SaveChanges(); 

J'ai essayé quelques exemples que j'ai trouvé et bien qu'ils n'erreur pas la base de données ne sont pas mis à jour. ..

[HttpPost] 
public ActionResult Edit(CitizenEntryViewModel citizenDetails) 
    { 
     ActiveCitizen activeCitizen = db.ActiveCitizen.SingleOrDefault(m => m.ID == citizenDetails.ActiveCitizen.ID); 

     if (activeCitizen != null) 
     { 
      citizenDetails.ActiveCitizen.CitizenUpdatedRecordOn = DateTime.Now; 
      // Fields we don't edit but still need to pass back 
      citizenDetails.ActiveCitizen.PublicID = activeCitizen.PublicID; 
      citizenDetails.ActiveCitizen.IsKIN = activeCitizen.IsKIN; 
      activeCitizen = citizenDetails.ActiveCitizen; 
      db.SaveChanges(); 
     } 
+0

Il n'y a pas besoin de changer manuellement l'état de l'objet en 'modified' Votre propriété' IP' dans le modèle est-elle correctement liée à la base de données? – Silvermind

+0

Avez-vous essayé de changer ori? ginal Propriétés de l'objet 'activeCitizen' et l'enregistrer? Ou appelez 'db.ObjectStateManager.ChangeObjectState (activeCitizen, EntityState.Modified);' avant 'db.SaveChanges();'? – Zabavsky

+0

Merci. Silvermind, le premier exemple de code a été tiré d'un projet MVC 3 il y a quelque temps. Zabavsky, j'ai essayé l'approche de changer l'état à 'modified' mais je n'ai pas semblé avoir accès à' ObjectStateManager'. VS Express 2012 indique: 'ActiveCitizenSystem.Models.ACSEntities' ne contient pas de définition pour ObjectStateManager. J'ai l'entrée namespace: 'using System.Data.Objects;' – ChrisCurrie

Répondre

4

J'ai réussi à résoudre ce problème en utilisant le code suivant mentionné dans this SO post qui montre comment enregistrer seulement les nouvelles valeurs:

db.Entry(activeCitizen).CurrentValues.SetValues(citizenDetails.ActiveCitizen); 

Remarque, j'ai rencontré l'erreur: "Un objet avec la même clé existe déjà dans ObjectStateManager. . Le ObjectStateManager ne peut pas suivre plusieurs objets avec la même clé »

This SO post m'a aidé à surmonter cette question

Le code final était donc:

var currentCitizen = db.ActiveCitizen.Find(citizenDetails.ActiveCitizen.ID); 
db.Entry(currentCitizen).CurrentValues.SetValues(citizenDetails.ActiveCitizen); 
db.SaveChanges(); 
0

Essayez cette

[HttpPost] 
public ActionResult Edit(CitizenEntryViewModel citizenDetails) 
{ 
    ActiveCitizen activeCitizen = db.ActiveCitizen.SingleOrDefault(m => m.ID == citizenDetails.ActiveCitizen.ID); 

    if (activeCitizen != null) 
    { 
     UpdateModel(activeCitizen); 
     db.SaveChanges(); 
    } 
+0

Qu'est-ce que 'UpdateModel'? – Zabavsky

+0

visitez Joe Stevens blog pour voir comment fonctionne le modèle de mise à jour. http://www.joe-stevens.com/2010/02/17/asp-net-mvc-using-controller-updatemodel-when-using-a-viewmodel/ – Niraj

+0

Merci. J'ai essayé l'approche 'UpdateModel' et j'ai reçu l'erreur suivante: 'Le modèle de type' ActiveCitizenSystemMimic.Models.ActiveCitizen 'n'a pas pu être mis à jour.' J'ai ajouté une approche qui fonctionne ci-dessous. Merci beaucoup. – ChrisCurrie

Questions connexes