2010-11-02 19 views
12

Sto lavorando con EF CTP 4, utilizzando i modelli POCO, aggiungendo un nuovo oggetto e chiamo SaveChanges() funziona ma l'aggiornamento dell'oggetto non funziona. Ecco il codice per l'aggiornamento:Entity Framework POCO SaveChanges() in aggiornamento non funziona?

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

Non sono sicuro di quello che sto facendo qui. Qualche idea? Grazie.

risposta

20

Il problema è che quando si assegna il findContact = contactEntityState non viene cambiato nel ObjectStateManager (quindi è ancora impostato su Unchanged). Pertanto, non viene generata alcuna istruzione SQL Update per l'entità. Sono disponibili diverse opzioni per fare l'aggiornamento:

Opzione 1: Popola findContact campo per campo:

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

Opzione 2: Utilizzare il metodo ApplyCurrentValues:

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

Opzione 3: Collegare l'entità aggiornata e modificare lo stato in ObjectStateManager. (Nota: questo non farà un giro al database per il recupero del contatto esistente).

+0

Hi Yakimych, con ** Opzione 1 **, posso utilizzare AutoMapper per mappare tra findContact e contact, invece di mappare ogni proprietà? Grazie. – Saxman

+0

@Saxman - Anche se 'AutoMapper' viene normalmente utilizzato per mappare tra oggetti di tipi diversi, puoi provare ad usare lo stesso tipo su entrambi i lati della mappatura. Non l'ho usato da solo, ma potresti provarlo. E per favore pubblica un aggiornamento dopo aver risolto il problema - potrebbe essere utile per riferimenti futuri. – Yakimych

+0

Per qualche motivo non riesco a chiamare il metodo ** ApplyCurrentValues ​​() ** con il mio contesto, quindi l'opzione 2 è esclusa. Non ho provato l'opzione 3. AutoMapper non ha funzionato in questa situazione, devo impostare manualmente le proprietà di findContact uguale a contatto. Grazie! – Saxman

Problemi correlati