2011-02-21 11 views
13

Jaka jest różnica między:Linq do Entity AcceptAllChanges SaveChanges

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

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

i dlaczego istnieje db.Customers.DeleteObject(Mycustomer); i nie db.DeleteFromCustomer(Mycustomer);

Kiedy należy używać każdego z nich?

również jest systemami wątków encji framework? mam na myśli to, że gdyby dwa wątki zaktualizowały obiekt w kontekście sametime, czy spowodowałoby to awarię?

góry dzięki

Odpowiedz

12

db.AcceptAllChanges() zakłada, że ​​zakończyłeś powiązaną historię zmian i ją odrzucił - w razie dalszych problemów nie możesz odzyskać tych zmian. db.SaveChanges(false) zachowuje te zmiany w pamięci w przypadku problemów.

Aby uzyskać bardziej dogłębną odpowiedź, patrz http://blogs.msdn.com/b/alexj/archive/2009/01/11/savechanges-false.aspx.

db.AddToCustomer() to silnie typowane opakowanie o numerze db.Customers.AddObject(). Spójrz na jego definicję, a zobaczysz, co mam na myśli. Chciałbym użyć metody db.AddToCustomer() wyłącznie jako, że jest silnie wpisana i daje możliwość sprawdzenia typu czasu kompilacji.

Wyobrażam sobie, że jedynym powodem, dla którego nie ma DeleteFromCustomer() jest to, że nie sądzili, że praca będzie konieczna (ludzie mają tendencję do dodawania więcej niż usuwają). Nie ma jednak nic, co mogłoby Cię powstrzymać od stworzenia własnych metod rozszerzenia, ale możesz to zaimplementować samodzielnie.

EF nie jest bezpieczny dla wątków, jeśli chcesz wykonać aktualizacje, musisz samodzielnie zarządzać blokadą. Zobacz http://blog.cincura.net/230902-multithreading-with-entity-framework/ więcej :)

+0

AddObject jest silnie wpisany jako dobrze, ponieważ jest to metoda typu rodzajowego ObjectSet - w tym scenariuszu ObjectSet i zaliczane do tej metody jest AddObject (jednostka klienta). –

9

AcceptAllChanges ustawia tylko wszystkie dodane i zmodyfikowane podmioty w ObjectContextStateManager instancji Unchanged stanu i odłączyć wszystkie usunięte podmiotów, ale nie wykonać zmiany w bazie danych. SaveChanges wykonuje zmiany w bazie danych i domyślnie akceptuje również zmiany (można je skonfigurować, aby tego nie robić).

AddToCustomer jest taki sam jak Customers.AddObject - jest to skrót (tak samo jak DeleteObject). Pierwsza metoda jest generowana przez generator kodu (i myślę, że nazywa drugą, która jest standardową metodą z ObjectSet).

Struktura obiektu nie jest bezpieczna dla wątków. Ponadto powinno być very careful podczas udostępniania ObjectContext wśród kilku wątków.

Powiązane problemy