2011-02-21 10 views
13

Qual è la differenza tra i seguenti:LINQ to entità AcceptAllChanges SaveChanges

 db.AcceptAllChanges(); 
     // vs 
     db.SaveChanges(); 

     db.AddToCustomer() 
     // vs 
     db.Customers.AddObject(Mycustomer); 

e perché non v'è db.Customers.DeleteObject(Mycustomer); e nessun db.DeleteFromCustomer(Mycustomer);

quando dovrei usare ciascuno di essi?

è anche il framework di entità thread-safe? Voglio dire se due thread aggiornano l'oggetto nel contesto in cui sametime si arresterebbe?

grazie in anticipo

risposta

12

db.AcceptAllChanges() si presuppone che l'utente abbia terminato con qualsiasi cronologia delle modifiche associata e lo scarta. Se si verificano ulteriori problemi, non è possibile ripristinare tali modifiche. db.SaveChanges(false) mantiene tali modifiche in memoria in caso di problemi.

Vedere http://blogs.msdn.com/b/alexj/archive/2009/01/11/savechanges-false.aspx per una risposta più approfondita.

db.AddToCustomer() è un involucro fortemente tipizzato intorno a db.Customers.AddObject(). Guarda la definizione e vedrai cosa intendo. Vorrei usare il metodo db.AddToCustomer() puramente perché è fortemente digitato e ti dà il controllo del tipo di tempo compilato.

Immagino che l'unico motivo per cui non c'è lo DeleteFromCustomer() è che non pensavano che il lavoro sarebbe stato necessario (le persone tendono ad aggiungere più di quello che eliminano). Non c'è niente che ti impedisca di creare i tuoi metodi di estensione per implementarlo tu stesso.

L'EF non è thread-safe, se si desidera eseguire gli aggiornamenti è necessario gestire il blocco da soli. Vedere http://blog.cincura.net/230902-multithreading-with-entity-framework/ per più :)

+0

AddObject è fortemente tipizzato come bene perché è il metodo di tipo generico ObjectSet - in questo scenario ObjectSet e definiton del metodo è AddObject (entità Customer). –

9

AcceptAllChanges imposta solo tutte le entità aggiunti e modificati in ObjectContextStateManager esempio per Unchanged stato e staccare tutte le entità eliminate, ma non ha concluso le modifiche nel database. SaveChanges esegue le modifiche nel database e, per impostazione predefinita, accetta anche le modifiche (può essere configurato per non farlo).

AddToCustomer è lo stesso di Customers.AddObject - è solo una scorciatoia (uguale a DeleteObject). Il primo metodo è generato dal generatore di codice (e penso che chiami il secondo metodo standard di ObjectSet).

Entity framework non è thread-safe. Inoltre dovresti essere very careful quando condividi ObjectContext tra diversi thread.