2013-02-05 14 views
9

Nie do końca pewna, jak wyrazić to pytanie, ale tutaj jest. Pracuję nad projektem, w którym wiele aplikacji klienckich uzyskuje dostęp do jednego źródła danych za pośrednictwem usługi WCF. Może on nie być odpowiedni, ale usługa WCF korzysta z struktury encji, aby uzyskać dostęp do tego źródła danych. Ilekroć klient zapytał o rekord do edycji, chciałbym zapobiec temu, aby ten sam rekord był edytowany przez resztę klientów, dopóki pierwszy klient nie zakończy ich aktualizacji.Najlepsza praktyka blokowania rekordu do edycji podczas korzystania z struktury encji

Popraw mnie, jeśli się mylę, ale uważam, że jest to tak zwany synchroniczny i asynchroniczny dostęp do danych.

Moje pytanie brzmi, jaka jest najlepsza praktyka w branży do wdrożenia tej funkcji. Czy istnieje sposób kontrolowania tego od strony bazy danych (przy użyciu SQL) lub czy musi to być wykonywane przez klienta?

Rozważałem dodanie boolowskiej kolumny "EditMode" dla każdej tabeli i ustawienie jej na wartość true podczas edytowania i sprawdzenie, czy jest ustawiona na wartość true, zanim inny klient uzyska dostęp do tego rekordu.

Odpowiedz

6

Najlepsza praktyka polega na użyciu blokowania RowVersion i Optimistic.

Optimistic Concurrency Patterns wyjaśnione.

Jeśli używasz najpierw kodu, a następnie dołącz pole do swojego POCO.

public virtual byte[] RowVersion { get; set; } 

EF doda właściwość Timestamp/RowVersion do twojej tabeli. Zostanie to sprawdzone podczas aktualizacji. I automatycznie aktualizowane przez DB po zmianie.

EDYCJA: aby lepiej wyjaśnić.

To, czego szuka EF, to właściwości, które są polami współbieżności, dzięki czemu można faktycznie kontrolować współbieżność za pomocą jednego lub więcej pól.

entity.Property(p => p.RowVersion).IsConcurrencyToken() 

podczas przeprowadzania aktualizacji lub usunięcia złapać zdefiniowany wyjątek

catch (DbUpdateConcurrencyException ex) 

EF traktuje RowVersion jako wyraz współbieżności. Jest to ogólnie stosowane podejście. Ponieważ SQLServer automatycznie zaktualizuje ten typ pola dla ciebie. Tak bardzo szybko i łatwo. Ale możesz powiedzieć EF, że właściwość jest tokenem współbieżności i ma więcej niż jeden.

Funkcja EF powinna dodawać właściwości do klauzuli where w celu aktualizacji i usuwania , aby upewnić się, że rekord nie zmienił się po uzyskaniu dostępu.

+0

Dziękuję, to wydaje się być dokładnie tym, czego potrzebowałem. Po prostu nie byłem pewien, jak to się nazywa, aby samodzielnie przeprowadzić badania. –

+0

@phil soday - Jeśli używasz najpierw kodu i wstawiasz tę linię do swojej domeny, czy automatycznie wie, jak zablokować wiersz? Czy to musi być nazywane RowVersion? Czy rzuca wyjątek lub jak działa? – chobo2

+0

To wydaje się być tym, czego potrzebuję i jak długo nie używam kodu. Nadal używam EF5 edmx jest ich sposobem implementacji, co się dzieje, gdy użytkownik b dokonuje zmiany, zanim użytkownik zapisuje – rogue39nin

Powiązane problemy