9

Mi método de actualización no funciona en una aplicación ASP.NET MVC 3. He utilizado el siguiente código de EF 4.1:context.SaveChanges no funciona

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

y SaveAccount se parece a esto:

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

¿Están sus entidades adjuntas o separadas? – msmucker0527

+0

No estoy seguro de qué significa adjunto o separado ... – DotnetSparrow

+1

Puede proporcionar la parte del servicio donde se inserta/actualiza el registro/entidad. Sospecho que tienes una cláusula de uso. –

Respuesta

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(); 
} 

Alternativa:

internal void SaveAccount(Account account) { 

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

usted no está haciendo ningún cambio, por lo que no es realmente nada para ser salvo. La manera más simple puede ser hacer lo siguiente:

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

    context.SaveChanges(); 
} 
2

El problema aquí es que no está teniendo en cuenta el hecho de que las páginas web son apátridas. Probablemente escribas tu página con los datos de la cuenta devueltos desde la base de datos, pero luego el objeto se destruye al final de la solicitud.

En la devolución de datos, el cuaderno de modelo crea un nuevo objeto Acccount, pero este no está conectado a la base de datos, por lo que el contexto de la base de datos no tiene idea de que exista. Entonces, cuando llamas a SaveChanges, nada ha cambiado en lo que a ella respecta.

Debe obtener un nuevo objeto de Cuenta de la base de datos y actualizar sus campos con los datos de la cuenta creada por el binder modelo, o adjuntar el nuevo objeto de cuenta a la base de datos.