2009-08-03 11 views
7

znalazłem an MSDN article który opisuje jak EF obsługuje współbieżności podczas zapisywania zmian:Optymistyczna współbieżność w ADO.NET Entity Framework

Domyślnie [...] Usługi obiektu oszczędza obiektowi zmian w bazie danych bez kontroli dla współbieżności. Dla właściwości, które mogą wystąpić na wysoki stopień współbieżności, zalecamy własnością podmiotu być zdefiniowane w koncepcyjnym warstwy z atrybutem ConcurrencyMode = „stałej”

Mam dwa pytania:

  1. nie mając właściwości w moim modelu, w którym ConcurrencyMode="fixed", czy jest to bezpieczne dla mnie założenie, że jeśli kiedykolwiek OptimisticConcurrencyException jest wyrzucany podczas zapisywania zmian, to dlatego, że jednostka nie dłuższych exis ts w składnicy danych, tj. został usunięty przez innego użytkownika lub coś mi brakuje?

    Wyobrażam EF wykonujący takie UPDATE -statement, który wygląda mniej więcej tak, co, jak ja to widzę, spowoduje tylko OptimisticConcurrencyException zostać wyrzucony, jeśli osoba z ID = 1 nie istnieje:

    UPDATE Person SET FirstName = 'John' AND LastName = 'Smith' WHERE ID = 1 
    
  2. Podczas korzystania z ConcurrencyMode="fixed", czy EF sprawdza współbieżność również podczas usuwania elementów? Innymi słowy, EF kiedykolwiek wykonać DELETE -statement który wygląda tak (z więcej niż tylko klucza podstawowego w WHERE -clause):

    DELETE FROM Person WHERE ID = 1 AND LastName = 'Doe' 
    

Odpowiedz

6

dobre pytanie.

(1) Tak, ale niestety nie jest to takie proste. Ponieważ EF (3.5) ma niezależny model stowarzyszenia, powiązanie jest również traktowane niezależnie, a nawet jeśli nie zostało to powiedziane, staje się częścią sprawdzania współbieżności podczas AKTUALIZACJI i USUWANIA.

tj podczas aktualizacji osoba będzie często można zobaczyć nowości, które wyglądają tak:

UPDATE Person SET Partner = NULL AND FirstName = 'John' AND LastName = 'Smith' 
WHERE ID = 1 AND Partner = 2 

tj Partner jest kolumna FK.

To wszystko zmienia się w 4.0, jeśli używasz skojarzeń FK, tak jak oczekujemy większości ludzi.

(2) W przypadku USUŃ wszelkie właściwości ConcurrencyMode = 'fixed' są sprawdzane podczas usuwania. Wyjątek stanowi sytuacja, w której do usunięcia służy obiekt SPROC, który nie akceptuje wartości Współbieżności.

Nadzieja to pomaga

Alex

+0

dobra odpowiedź. To była dokładnie ta informacja, której szukałem. Wielkie dzięki! – bernhof

Powiązane problemy