2010-11-02 15 views
12

Estoy trabajando con EF CTP 4, usando modelos POCO, agregando un nuevo objeto y llamando a SaveChanges() funciona, pero la actualización del objeto no funciona. Aquí está el código para la actualización:Entity Framework POCO SaveChanges() en la actualización no funciona?

public void UpdateContact(Contact contact) 
     { 
      var findContact = GetContact(contact.ContactID); 
      findContact = contact; 
      _context.SaveChanges(); 
     } 

public Contact GetContact(int contactId) 
     { 
      return GetAllContacts().SingleOrDefault(c => c.ContactID == contactId); 
     } 

public IQueryable<Contact> GetAllContacts() 
     { 
      return _context.Contacts; 
     } 

No estoy seguro de lo que estoy haciendo mal aquí. ¿Alguna idea? Gracias.

Respuesta

20

El problema es que cuando se asigna el findContact = contactEntityState no puedan ser cambiados en el ObjectStateManager (por lo que todavía está llamado a Unchanged). Por lo tanto, no se genera ninguna declaración SQL Update para la entidad. Tiene varias opciones para hacer la actualización:

Opción 1: Llenar findContact campo por campo:

var findContact = GetContact(contact.ContactID); 
findContact.FirstName = contact.FirstName; 
findContact.LastName = contact.LastName; 
... 
_context.SaveChanges(); 

Opción 2: Uso del ApplyCurrentValues método:

var findContact = GetContact(contact.ContactID); 
_context.ApplyCurrentValues("Contacts", contact); 
_context.SaveChanges(); 

Opción 3: Adjunte la entidad actualizada y cambie el estado en el ObjectStateManager. (Nota: esto no hará una ida y vuelta a la base de datos para recuperar el contacto existente).

_context.AttachTo("Contacts", contact); 
var contactEntry = Context.ObjectStateManager.GetObjectStateEntry(contact); 
contactEntry.ChangeState(EntityState.Modified); 
_context.SaveChanges(); 
+0

Hola Yakimych, con ** Opción 1 **, ¿puedo usar AutoMapper para mapear entre findContact y contacto, en lugar de mapear cada propiedad? Gracias. – Saxman

+0

@Saxman - Aunque 'AutoMapper' se usa normalmente para mapear objetos de diferentes tipos, puede intentar usar el mismo tipo en ambos lados de la asignación. No lo he usado yo mismo, pero podrías intentarlo. Y publique una actualización después de resolver el problema; podría ser útil para futuras referencias. – Yakimych

+0

Por algún motivo, no puedo llamar al método ** ApplyCurrentValues ​​() ** con mi contexto, por lo que la opción 2 está descartada. No probé la opción 3. AutoMapper no funcionó en esta situación, tengo que configurar manualmente las propiedades de findContact para contactar. ¡Gracias! – Saxman

Cuestiones relacionadas