2011-05-27 9 views
5

Soy terrible con las bases de datos así que por favor tengan paciencia conmigo.Cómo actualizar una base de datos con nueva información

Tengo un programa que obtiene cierta información del usuario y la agrega a una tabla de base de datos. Luego necesito obtener más información para esa tabla y actualizarla. Para ello he tratado de hacer esto:

public static void updateInfo(string ID, string email, bool pub) 
    { 
     try 
     { 
      //Get new data context 
      MyDataDataContext db = GetNewDataContext(); //Creates a new data context 

      //Table used to get user information 
      User user = db.Users.SingleOrDefault(x => x.UserId == long.Parse(ID)); 

      //Checks to see if we have a match 
      if (user != null) 
      { 
       //Add values 
       user.Email = email; 
       user.Publish = publish; 
      } 

      //Prep to submit changes 
      db.Users.InsertOnSubmit(user); 
      //Submit changes 
      db.SubmitChanges(); 
     } 
     catch (Exception ex) 
     { 
      //Log error 
      Log(ex.ToString()); 
     } 
    } 

pero me sale este error:

System.InvalidOperationException: No se puede agregar una entidad que ya existe.

Sé que esto se debe a que ya tengo una entrada en la tabla, pero no sé cómo editar el código para actualizar y no intentar crear uno nuevo.

¿Por qué esto no funciona? ¿No enviaría cambios en un elemento actual para actualizar ese elemento y no crear uno nuevo?

Respuesta

7

El problema es

//Prep to submit changes 
db.Users.InsertOnSubmit(user); 

Debido a que usted tiene el usuario de la BD ya, no es necesario volver a asociar con el contexto.

Comenta eso y listo.

Simplemente un comentario de estilo/uso también. Debe disponer de su contexto:

public static void updateInfo(string ID, string email, bool pub) 
{ 
    try 
    { 
     using (MyDataDataContext db = GetNewDataContext()) 
     { 
      User user = db.Users.SingleOrDefault(x => x.UserId == long.Parse(ID)); 

      if (user != null) 
      { 
       user.Email = email; 
       user.Publish = publish; 
      } 

      db.SubmitChanges(); 
     } 
    } 
    catch (Exception ex) 
    { 
     //Log error 
     Log(ex.ToString()); 

     // TODO: Consider adding throw or telling the user of the error. 
     // throw; 

    } 
} 
+0

Sí que lo hizo. Gracias por la ayuda –

+0

Se fusionó en mi segunda respuesta anterior sobre el uso de ... –

Cuestiones relacionadas