Udostępnij za pośrednictwem


Jednostki samośledzące

Ważne

Nie zalecamy już używania szablonu jednostek samośledzących. Będzie on nadal dostępny tylko na potrzeby obsługi istniejących aplikacji. Jeśli Twoja aplikacja wymaga pracy z odłączonymi grafami jednostek, rozważ inne alternatywy, takie jak jednostki z możliwością śledzenia (technologia podobna do jednostek samośledzących, która jest aktywniej rozwijana przez społeczność) lub napisanie niestandardowego kodu przy użyciu interfejsów API śledzenia zmian niskiego poziomu.

W aplikacji opartej na platformie Entity Framework za śledzenie zmian w obiektach odpowiedzialny jest kontekst. Następnie należy użyć metody SaveChanges, aby utrwalić zmiany w bazie danych. Podczas pracy z aplikacjami N-warstwowymi obiekty jednostek są odłączone od kontekstu, więc musisz zdecydować, jak chcesz śledzić zmiany i zgłaszać je do kontekstu. Jednostki samośledzące (STE) mogą ułatwić śledzenie zmian w dowolnej warstwie, a następnie odtwarzanie tych zmian w kontekście do zapisania.

Używaj jednostek STE tylko wtedy, gdy kontekst nie jest dostępny w warstwie, w której są wprowadzane zmiany w wykresie obiektu. Jeśli kontekst jest dostępny, nie ma potrzeby używania jednostek STE, ponieważ kontekst zajmie się śledzeniem zmian.

Ten element szablonu generuje dwa pliki tt (szablon tekstowy):

  • Plik <nazwa modelu>.tt generuje typy jednostek i klasę pomocnika, która zawiera logikę śledzenia zmian używaną przez jednostki samośledzące oraz metody rozszerzenia, które umożliwiają ustawianie stanu jednostek samośledzących.
  • Plik <nazwa modelu>.Context.tt generuje kontekst pochodny i klasę rozszerzenia zawierającą metody ApplyChanges dla klas ObjectContext i ObjectSet. Te metody sprawdzają informacje śledzenia zmian zawarte na wykresie jednostek samośledzących, aby wywnioskować zestaw operacji, które należy wykonać w celu zapisania zmian w bazie danych.

Rozpocznij

Aby rozpocząć pracę, odwiedź stronę Przewodnik po jednostkach samośledzących.

Zagadnienia funkcjonalne podczas pracy z jednostkami samośledzącymi

Ważne

Nie zalecamy już używania szablonu jednostek samośledzących. Będzie on nadal dostępny tylko na potrzeby obsługi istniejących aplikacji. Jeśli Twoja aplikacja wymaga pracy z odłączonymi grafami jednostek, rozważ inne alternatywy, takie jak jednostki z możliwością śledzenia (technologia podobna do jednostek samośledzących, która jest aktywniej rozwijana przez społeczność) lub napisanie niestandardowego kodu przy użyciu interfejsów API śledzenia zmian niskiego poziomu.

Podczas pracy z jednostkami samośledzącymi należy wziąć pod uwagę następujące kwestie:

  • Upewnij się, że projekt klienta zawiera odwołanie do zestawu zawierającego typy jednostek. Jeśli do projektu klienta dodasz tylko odwołanie do usługi, projekt klienta będzie używać typów serwerów proxy WCF, a nie rzeczywistych typów jednostek samośledzących. Oznacza to, że nie uzyskasz zautomatyzowanych funkcji powiadomień, które zarządzają śledzeniem jednostek w kliencie. Jeśli celowo nie chcesz dołączać typów jednostek, musisz ręcznie ustawić informacje o śledzeniu zmian w kliencie, aby zmiany były wysyłane z powrotem do usługi.

  • Wywołania operacji usługi powinny być bezstanowe i tworzyć nowe wystąpienie kontekstu obiektu. Zalecamy również utworzenie kontekstu obiektu w bloku using.

  • Gdy wyślesz do usługi wykres zmodyfikowany w kliencie, a następnie zamierzasz kontynuować pracę z tym samym wykresem w kliencie, musisz ręcznie wykonać iterację za pośrednictwem wykresu i wywołać metodę AcceptChanges na każdym obiekcie, aby zresetować śledzenie zmian.

    Jeśli obiekty na wykresie zawierają właściwości z wartościami wygenerowanymi przez bazę danych (na przykład wartościami dotyczącymi tożsamości lub współbieżności), platforma Entity Framework zastąpi wartości tych właściwości wartościami wygenerowanymi przez bazę danych, gdy zostanie wywołana metoda SaveChanges. Możesz zaimplementować operację usługi, aby zwrócić zapisane obiekty lub listę wygenerowanych wartości właściwości dla obiektów z powrotem do klienta. Następnie klient musi zastąpić wystąpienia obiektów lub wartości właściwości obiektu obiektami lub wartościami właściwości zwróconymi z operacji usługi.

  • Scalanie wykresów z wielu żądań obsługi może spowodować wprowadzenie obiektów ze zduplikowanymi wartościami klucza w wynikowym wykresie. Platforma Entity Framework nie usuwa obiektów ze zduplikowanymi kluczami podczas wywoływania metody ApplyChanges, ale zamiast tego zgłasza wyjątek. Aby uniknąć powstawania wykresów ze zduplikowanymi wartościami kluczy, postępuj zgodnie z jednym z wzorców opisanych w następującym wpisie w blogu: Jednostki samośledzące: ApplyChanges i zduplikowane jednostki.

  • Gdy zmienisz relację między obiektami przez ustawienie właściwości klucza obcego, właściwość nawigacji odwołania zostanie ustawiona na wartość null i nie będzie synchronizowana z odpowiednią jednostką usługi w kliencie. Po dołączeniu wykresu do kontekstu obiektu (na przykład po wywołaniu metody ApplyChanges) właściwości klucza obcego i właściwości nawigacji są synchronizowane.

    Brak właściwości nawigacji odwołania zsynchronizowanej z odpowiednim obiektem podmiotu zabezpieczeń może być problemem, jeśli określono kaskadowe usunięcie w relacji klucza obcego. Jeśli usuniesz podmiot zabezpieczeń, usunięcie nie zostanie rozpropagowane do obiektów zależnych. Jeśli określono usuwanie kaskadowe, użyj właściwości nawigacji, aby zmienić relacje zamiast ustawiać właściwość klucza obcego.

  • Jednostki samośledzące nie obsługują ładowania z opóźnionego.

  • Serializacja binarna i serializacja obiektów zarządzania stanem ASP.NET nie jest obsługiwana przez jednostki samodzielnego śledzenia. Możesz jednak dostosować szablon, aby dodać obsługę serializacji binarnej. Aby uzyskać więcej informacji, zobacz Używanie serializacji binarnej i klasy ViewState z jednostkami samośledzącymi.

Zagadnienia związane z zabezpieczeniami

Podczas pracy z jednostkami samośledzącymi należy wziąć pod uwagę następujące zagadnienia dotyczące zabezpieczeń:

  • Usługa nie powinna ufać żądaniom pobierania lub aktualizowania danych z niezaufanego klienta ani za pośrednictwem niezaufanego kanału. Klient musi być uwierzytelniony: należy użyć bezpiecznego kanału lub koperty wiadomości. Żądania klientów dotyczące aktualizacji lub pobierania danych muszą zostać zweryfikowane, aby mieć pewność, że są one zgodne z oczekiwanymi i uzasadnionymi zmianami w danym scenariuszu.
  • Unikaj używania informacji poufnych jako kluczy jednostek (na przykład numerów ubezpieczenia społecznego). Ogranicza to możliwość niezamierzonej serializacji poufnych informacji na wykresach jednostek samośledzących do klienta, który nie jest w pełni zaufany. W przypadku skojarzeń niezależnych oryginalny klucz jednostki powiązanej z jednostką, która jest serializowana, może być również wysyłany do klienta.
  • Aby uniknąć propagacji komunikatów o wyjątkach zawierających poufne dane do warstwy klienta, wywołania metod ApplyChanges i SaveChanges w warstwie serwera powinny być opakowane w kod obsługi wyjątków.