2010-07-08 23 views
11

¿Cómo puedo actualizar una entidad sin tener que hacer una llamada para seleccionarla? Si proporciono la clave para la entidad, no debería saber si desea actualizar después de invocar a SaveChanges() en ObjectContext.EF4 Entidad de actualización sin primera obtención de la entidad

Actualmente hago esto:

var user = context.Users.Single(u => u.Id == 2); 
user.Username = "user.name"; 
user.Name = "ABC 123"; 
context.SaveChanges(); 

que funciona, pero obliga a una selección. Porque sé el Id, por qué no puedo hacer algo como esto:

var user = new User(); 
user.Id = 2; 
user.Username = "user.name"; 
user.Name = "ABC 123"; 
context.UpdateObject(user); 
context.SaveChanges(); 

Gracias de antemano.

EDIT: Además, es importante que sólo las propiedades afectadas que se cambian ser actualizados. es posible?

Respuesta

12

Quizás el siguiente código funcione bien.

var user = new User(); 
user.Id = 2; 
context.Users.Attach(user); 

user.Username = "user.name"; 
user.Name = "ABC 123"; 

context.SaveChanges(); 
+0

Eso realmente no * actualiza * el objeto en la base de datos. Sin embargo, lo agrega a la lista de usuarios. – TheCloudlessSky

+0

Llamar 'context.ObjectStateManager.GetObjectStateEntry (usuario) .ChangeState (EntityState.Modified);' realiza la actualización ... – TheCloudlessSky

+1

¿Cambia la propiedad Name después de "context.Users.Attach (user);"? – user386740

-1

¿No tienes que seleccionarlo de todos modos para obtener sus datos para editar? Si lo almacena en caché, no le costará nada obtenerlo nuevamente cuando lo guarde.

+9

En una aplicación web típica, debe seleccionar, generar una página que contenga los Id, y "olvidarse de eso". Después de que el usuario actualiza la información y envía el formulario, usted recupera el Id y los nuevos datos. Esto es cuando desea SOLO actualizar, en lugar de buscar los datos, no necesita un tiempo adicional antes de actualizar. – Yakimych

+1

@Yakimych - Sí, esa es exactamente la situación con la que estoy trabajando. Realmente no necesito hacer un viaje al db para seleccionarlo aunque tenga los datos. – TheCloudlessSky

4

Usted puede hacer esto de una manera un tanto artificial, mediante la adición de la entidad y el cambio de la EntityState de modificación:

var user = new User(); 
user.Id = 2; 
user.Username = "user.name"; 
user.Name = "ABC 123"; 

context.AddToUsers(user); 
ObjectStateEntry userEntry = context.ObjectStateManager.GetObjectStateEntry(user); 
userEntry.ChangeState(EntityState.Modified); 

context.SaveChanges(); 

De esta manera se le indica al ObjectContext para encontrar una entrada con ID = 2 y actualizarlo en lugar de agregar una nueva entrada a la base de datos.

+1

Ok eso es genial. El problema funciona pero * uno *. ¿Qué sucede si solo quiero cambiar la propiedad 'Name'? No quiero que todos los campos causen una actualización. ¿Es esto una limitación con EF? – TheCloudlessSky

+0

funciona como un amuleto ... gracias. – sikender

Cuestiones relacionadas