2011-01-28 16 views
8

Come si eseguirà un'operazione di aggiornamento con CTP 5 utilizzando DbContext e utilizzando il pattern Repository? Prima con EF 4.0, poteva essere fatto come di seguito.Entity Framework CTP 5 - Schema del repository - esecuzione degli aggiornamenti

_context.Customers.AddObject(item); 
_context.ObjectStateManager.ChangeObjectState(item, System.Data.EntityState.Modified); 

v'è alcuna ragione per spiegare perché EF non fornisce un modo semplice per aggiornare entità "estratto". Non voglio interrogare il db e copiare tutte le proprietà sull'oggetto che viene restituito dalla query. In altre parole, EF dovrebbe avere un metodo di aggiornamento che includa l'entità (simile al metodo Aggiungi). Se la chiave entità esiste già nel database, aggiornare l'entità con i valori correnti. Ad esempio, dovremmo fare "Allega" e quindi copiare tutte le proprietà sull'oggetto allegato. A me sembra ridondante copiare tutte le proprietà delle entità solo per aggiornarle quando l'oggetto "disconnesso" esiste già.

risposta

8

credo è ancora possibile eseguire lo stesso metodo come nel tuo esempio di codice per aggiornare un'entità scollegato con la CTP5 DbContext:

_dbContext.Customers.Add(item); 
DbEntityEntry entry = _dbContext.Entry(item); 
entry.State = EntityState.Modified; 

_dbContext.SaveChanges(); 

Guardando il codice SQL generato questo crea ovviamente una dichiarazione aggiornamento completo su tutti proprietà dell'oggetto cliente incluse le proprietà che non sono state effettivamente modificate, poiché EF non sa quale sia lo stato corrente nel database. Se si vuole evitare che, immagino che non c'è altra via che andare a prendere lo stato corrente nel database prima che l'aggiornamento che potrebbe essere fatto in questo modo:

DbEntityEntry entry = _dbContext.Entry(_dbContext.Customers.Find(item.ID)); 
entry.CurrentValues.SetValues(entity); 

_dbContext.SaveChanges(); 

(Assumendo che qui si ha una chiave ID sul vostro cliente oggetto "oggetto".)

Questo crea una dichiarazione di aggiornamento SQL che include solo le proprietà che effettivamente sono cambiate rispetto allo stato nel database. Non sono sicuro che la seconda via sia necessariamente l'opzione meno performante a causa dell'istruzione select aggiuntiva. Se il tipo di oggetto è grande ma solo poche proprietà hanno cambiato il sovraccarico di invio di una dichiarazione di aggiornamento completa su tutti i campi potrebbe essere più grande di un'istruzione select più una "piccola" istruzione di aggiornamento con solo i campi che sono realmente necessari per l'aggiornamento. (Ma questa è solo una speculazione, io non sono uno specialista di SQL Server.)

+0

Questo è esattamente quello che stavo cercando. Grazie. Ho un'altra domanda al riguardo che viene posta nel commento su http://stackoverflow.com/questions/4167033/entity-framework-poco-with-foreign-keys. Fatemi sapere cosa ne pensate. "Come procedere con DbContext in EF CTP 5 e con" Generatore DbContext di Ado.net "? Non esiste alcun codice di correzione, quindi l'impostazione DirectorId non cancella Director.Sempre sempre l'impostazione movie.Director = null dopo aver impostato DirectorId my unica opzione? " – Jonna

+0

Scusa, davvero non lo so, non ho usato il generatore di DbContext fino ad ora. – Slauma

+0

BTW: Se non trovi risposte soddisfacenti su CTP5, il forum di pre-rilascio di EF potrebbe essere un altro buon posto per chiedere: http://social.msdn.microsoft.com/Forums/en-US/adonetefx/threads – Slauma

Problemi correlati