9

Ma méthode de mise à jour ne fonctionne pas dans une application ASP.NET MVC 3. Je l'ai utilisé le code suivant EF 4.1:context.SaveChanges ne fonctionne pas

[HttpPost] 
public ActionResult UpdateAccountDetails(Account account) 
{ 
    if (ModelState.IsValid) 
    { 
     service.SaveAccount(account); 
    } 
} 

et SaveAccount ressemble à ceci:

internal void SaveAccount(Account account) {   
    context.SaveChanges(); 
} 
+1

vos entités sont-elles attachées ou détachées? – msmucker0527

+0

Je ne suis pas sûr de savoir ce que cela signifie par attaché ou détaché ... – DotnetSparrow

+1

Pouvez-vous fournir la partie du service où l'enregistrement/entité est inséré/mis à jour. Je suppose que vous avez une clause d'utilisation. –

Répondre

12
internal void SaveAccount(Account account) { 

    // Load current account from DB 
    var accountInDb = context.Accounts.Single(a => a.Id == account.Id); 

    // Update the properties 
    context.Entry(accountInDb).CurrentValues.SetValues(account); 

    // Save the changes 
    context.SaveChanges(); 
} 

Alternative:

internal void SaveAccount(Account account) { 

    context.Entry(account).State = EntityState.Modified; 
    context.SaveChanges(); 
} 
1

Vous n'êtes pas apporter de modifications, donc il n'y a vraiment rien à être sauvé. La manière la plus simple peut être la suivante:

internal void SaveAccount(Account account) 
{ 
    context.Attach(account); 
    ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(account); 
    entry.SetModified(); 

    context.SaveChanges(); 
} 
2

Le problème ici est que vous ne tenez pas compte du fait que les pages Web sont sans état. Vous avez probablement pupulé votre page avec les données de compte renvoyées à partir de la base de données, mais l'objet est ensuite détruit à la fin de la demande.

Lors de la publication, un nouvel objet Acccount est créé par le classeur de modèle, mais celui-ci n'étant pas connecté à la base de données, votre contexte de base de données ne sait même pas qu'il existe. Ainsi, lorsque vous appelez SaveChanges, rien n'a changé en ce qui le concerne.

Vous devez soit obtenir un nouvel objet Compte à partir de la base de données et mettre à jour ses champs avec les données du modèle créé par le classeur, soit associer le nouvel objet compte à la base de données.