2013-01-11 17 views
5

dire che ho qualcosa di simile che si chiama in Controller:Quando chiamare SaveChanges

using (var context = new SqlContext()) 
{ 
    context.Items.Add(new Item("item1")); 
} 

Dovrei chiamando context.SaveChanges();?

risposta

9

entità framework implementa un'unità di modello di lavoro con DbContext, ciò significa che si definisce un pacchetto di cose che si desidera fare nel proprio database e quindi si invitano le modifiche di salvataggio per propagarle tutte nel database contemporaneamente. Tutte le operazioni verranno eseguite all'interno di una singola transazione (per una singola chiamata saveChanges), il che significa che tutti o nessuno verranno propagati al database contemporaneamente.

Prima di chiamare salvare le modifiche, le modifiche vengono applicate al grafico di localizzazione locale ma non al database stesso fino a quando non viene richiamato il savechanges.

+0

Il grafico di tracciamento locale verrà mantenuto dopo che il 'DbContext' locale è stato eliminato? –

+0

Se non chiamo 'SaveChanges()' prima che il 'DbContext' sia eliminato, dove dovrei chiamarlo? –

+1

non disporre il contesto eliminerà tutte le modifiche in sospeso, il grafico di tracciamento esiste solo per il ciclo di vita del contesto in modo che sia eliminato quando il contesto è disposto –

1

sì.

ogni modifica apportata non verrà salvata finché non viene chiamato context.SaveChanges();.

Si noti che se si avrà un oggetto da altri DbContext (che non è assolutamente la situazione che hai dato) dovrebbe essere necessario cambiare lo stato soggetto in modo esplicito utilizzando queste righe di codice, invece:

Item item = new Item("item1") 
db.Entry(item).State = EntityState.Modified; 
db.SaveChanges(); 
+0

in generale l'unità di lavoro suggerisce che tutte le modifiche apportate da un'azione dell'utente debbano avvenire contemporaneamente. nella maggior parte dei casi questo significa che non dovresti estendere le istanze di DbContext, e se sei .Attach -> make change -> SaveChanges è il metodo suggerito. L'unica volta in cui ho mai usato i flag di modifica esplicita sta implorando altri contesti di dati nella parte superiore di EF (come un repository generico) –

Problemi correlati