Sdílet prostřednictvím


Entity s vlastním sledováním

Důležité

Šablonu entit s vlastním sledováním už nedoporučujeme používat. Bude nadále k dispozici jen pro podporu existujících aplikací. Pokud vaše aplikace vyžaduje práci s odpojenými grafy entit, zvažte jiné alternativy, jako jsou sledovatelné entity, což je technologie podobná entitám s vlastním sledováním, která je aktivněji vyvíjena komunitou, nebo vytvoření vlastního kódu pro sledování změn pomocí nízkoúrovňových rozhraní API.

V aplikaci založené na sadě Entity Framework je kontext zodpovědný za sledování změn v objektech. Pak použijete metodu SaveChanges k zachování změn v databázi. Při práci s n-vrstvými aplikacemi jsou objekty entit obvykle odpojené od kontextu a musíte se proto rozhodnout, jak sledovat změny a oznamovat tyto změny zpět kontextu. Entity s vlastním sledováním (self-tracking entity – STE) vám můžou pomoct sledovat změny v libovolné vrstvě a pak tyto změny přehrát do kontextu, který se má uložit.

Entity s vlastním sledováním použijte pouze v případě, že kontext není k dispozici ve vrstvě, kde se provádějí změny v grafu objektů. Pokud je kontext dostupný, není třeba entity s vlastním sledováním používat, protože kontext se o sledování změn postará sám.

Tato položka šablony generuje dva soubory .tt (textová šablona):

  • Soubor <název modelu>.tt vygeneruje typy entit a pomocnou třídu obsahující logiku sledování změn, která je používána entitami s vlastním sledováním a rozšířujícími metodami umožňujícími nastavení stavu u entit s vlastním sledováním.
  • Soubor <název modelu>.Context.tt vygeneruje odvozený kontext a třídu rozšíření obsahující metody ApplyChanges pro třídy ObjectContext a ObjectSet. Tyto metody prověřují informace o sledování změn obsažené v grafu entit s vlastním sledováním, aby bylo možné odvodit sadu operací, které je potřeba provést k uložení změn v databázi.

Začínáme

Začněte tím, že navštívíte stránku Návod k entitám s vlastním sledováním .

Důležité informace o funkcích při práci s entitami s vlastním sledováním

Důležité

Šablonu entit s vlastním sledováním už nedoporučujeme používat. Bude nadále k dispozici jen pro podporu existujících aplikací. Pokud vaše aplikace vyžaduje práci s odpojenými grafy entit, zvažte jiné alternativy, jako jsou sledovatelné entity, což je technologie podobná entitám s vlastním sledováním, která je aktivněji vyvíjena komunitou, nebo vytvoření vlastního kódu pro sledování změn pomocí nízkoúrovňových rozhraní API.

Při práci s entitami s vlastním sledováním vezměte v úvahu následující informace:

  • Ujistěte se, že váš klientský projekt má odkaz na sestavení obsahující typy entit. Pokud do klientského projektu přidáte pouze odkaz na službu, bude klientský projekt používat typy proxy serveru WCF, nikoli skutečné typy entit s vlastním sledováním. To znamená, že nebudete mít k dispozici funkce automatického oznamování, které spravují sledování entit v klientovi. Pokud záměrně nechcete zahrnout typy entit, budete muset ručně nastavit informace o sledování změn v klientovi, aby se změny odesílaly zpět do služby.

  • Volání operace služby by měla být bezstavová a vytvořit novou instanci kontextu objektu. Doporučujeme také vytvořit kontext objektu v bloku using .

  • Když odešlete graf upravený v klientovi do služby a pak chcete pokračovat v práci se stejným grafem v klientovi, musíte ručně iterovat přes graf a volat metodu AcceptChanges u každého objektu, aby se resetoval modul sledování změn.

    Pokud objekty v grafu obsahují vlastnosti s hodnotami vygenerovanými databází (například hodnotami identity nebo souběžnosti), Entity Framework nahradí hodnoty těchto vlastností hodnotami vygenerovanými databází po volání metody SaveChanges . Operaci služby můžete implementovat tak, aby se vrátily uložené objekty nebo seznam vygenerovaných hodnot vlastností pro objekty zpět klientovi. Klient by pak musel nahradit instance objektů nebo hodnoty vlastností objektů objekty nebo hodnotami vlastností vrácenými z operace služby.

  • Sloučení grafů z více žádostí o služby může ve výsledném grafu zavést objekty s duplicitními hodnotami klíčů. Entity Framework neodebere objekty s duplicitními klíči při volání metody ApplyChanges, ale místo toho vyvolá výjimku. Pokud se chcete vyhnout grafům s duplicitními hodnotami klíčů, postupujte podle jednoho ze vzorů popsaných v následujícím blogu: Entity s vlastním sledováním: ApplyChanges a duplicitní entity.

  • Když změníte relaci mezi objekty nastavením vlastnosti cizího klíče, referenční navigační vlastnost se nastaví na hodnotu null a nesynchronizuje se s příslušnou entitou objektu zabezpečení v klientovi. Po připojení grafu ke kontextu objektu (například po volání metody ApplyChanges) se vlastnosti cizího klíče a navigační vlastnosti synchronizují.

    Nemít referenční navigační vlastnost synchronizovanou s příslušným objektem zabezpečení by mohl být problém, pokud jste zadali kaskádové odstranění v relaci cizího klíče. Pokud odstraníte objekt zabezpečení, odstranění se nebude šířit do závislých objektů. Pokud jste zadali kaskádové odstranění, změňte relace pomocí navigačních vlastností místo nastavení vlastnosti cizího klíče.

  • Entity s vlastním sledováním nejsou povolené k provádění opožděného načítání.

  • Binární serializace a serializace na objekty správy stavu ASP.NET není u entit s vlastním sledováním podporována. Šablonu ale můžete přizpůsobit tak, aby přidala podporu binární serializace. Další informace najdete v tématu Použití binární serializace a ViewState s entitami s vlastním sledováním.

Aspekty zabezpečení

Při práci s entitami s vlastním sledováním byste měli vzít v úvahu následující aspekty zabezpečení:

  • Služba by neměla důvěřovat požadavkům na načtení nebo aktualizaci dat od nedůvěryhodného klienta nebo prostřednictvím nedůvěryhodného kanálu. Klient musí být ověřený: měl by se použít zabezpečený kanál nebo obálka zpráv. Požadavky klientů na aktualizaci nebo načtení dat musí být ověřeny, aby bylo zajištěno, že odpovídají očekávaným a legitimním změnám daného scénáře.
  • Nepoužívejte citlivé informace jako klíče entit (například čísla sociálního pojištění). Tím se omezuje možnost neúmyslně serializovat citlivé informace v grafech entit s vlastním sledováním klientovi, který není plně důvěryhodný. U nezávislých přidružení může být klientovi odeslán i původní klíč entity související s tou, která je serializována.
  • Aby se zabránilo šíření zpráv výjimek, které obsahují citlivá data, na úroveň klienta, musí být volání ApplyChanges a SaveChanges na úrovni serveru zabalena do kódu zpracování výjimek.