Sdílet prostřednictvím


Stavy objektů a sledování změn

LinQ to SQL objekty se vždy účastní v určitém stavu. Například když LINQ to SQL vytvoří nový objekt, objekt je ve Unchanged stavu. Nový objekt, který vytvoříte sami, je neznámý DataContext a je ve Untracked stavu. Po úspěšném spuštění SubmitChangesjsou všechny objekty známé pro LINQ to SQL ve Unchanged stavu. (Jediná výjimka je reprezentována těmi, které byly úspěšně odstraněny z databáze, které jsou ve Deleted stavu a nepoužitelné v dané DataContext instanci.)

Stavy objektů

Následující tabulka uvádí možné stavy pro objekty LINQ to SQL.

Stát Popis
Untracked Objekt, který linQ to SQL nesleduje. To demonstrují následující příklady:

– Objekt, na který se dotazuje prostřednictvím aktuálního DataContext objektu (například nově vytvořený objekt).
- Objekt vytvořený prostřednictvím deserializace
- Objekt dotazovaný pomocí jiného DataContextobjektu .
Unchanged Objekt načtený pomocí aktuálního DataContext objektu a není známo, že byl od jeho vytvoření změněn.
PossiblyModified Objekt, který je připojen k objektu DataContext. Další informace naleznete v tématu Načítání dat a operace CUD v N-vrstvých aplikacích (LINQ to SQL).
ToBeInserted Objekt nebyl načten pomocí aktuálního DataContextobjektu . To způsobí, že databáze INSERT během SubmitChanges.
ToBeUpdated Objekt, o který se vědělo, že byl změněn od jeho načtení. To způsobí, že databáze UPDATE během SubmitChanges.
ToBeDeleted Objekt označený k odstranění, což způsobuje databázi DELETE během SubmitChanges.
Deleted Objekt, který byl odstraněn v databázi. Tento stav je konečný a neumožňuje další přechody.

Vkládání objektů

Můžete explicitně požádat Inserts pomocí .InsertOnSubmit Alternativně může LINQ to SQL odvodit Inserts vyhledáním objektů připojených k některému ze známých objektů, které je třeba aktualizovat. Pokud například přidáte objekt do objektu Untracked nebo nastavíte UntrackedEntityRef<TEntity> objekt, zpřístupníte ho Untracked prostřednictvím sledovaných objektů v EntitySet<TEntity> grafu. Při zpracování SubmitChangesprochází LINQ to SQL sledované objekty a zjišťuje všechny dosažitelné trvalé objekty, které nejsou sledovány. Takové objekty jsou kandidáty pro vložení do databáze.

U tříd v hierarchii dědičnosti (o) také nastaví hodnotu člena určeného jako diskriminátor tak, InsertOnSubmitaby odpovídal typu objektu o. V případě typu odpovídajícího výchozí diskriminující hodnotě tato akce způsobí, že se diskriminující hodnota přepíše výchozí hodnotou. Další informace naleznete v tématu Podpora dědičnosti.

Důležité

Objekt přidaný Table do mezipaměti identit není v mezipaměti identit. Mezipaměť identit odráží pouze to, co se načítá z databáze. Po volání InsertOnSubmitse přidaná entita nezobrazí v dotazech na databázi, dokud SubmitChanges nebude úspěšně dokončena.

Odstraňování objektů

Pro odstranění označíte sledovaný objekt o voláním DeleteOnSubmit(o) na příslušném Table<TEntity>místě . LINQ to SQL považuje odebrání objektu z EntitySet<TEntity> operace aktualizace a odpovídající hodnota cizího klíče je nastavena na hodnotu null. Cíl operace (o) se z tabulky neodstraní. Označuje například aktualizaci, cust.Orders.DeleteOnSubmit(ord) kde je vztah mezi cust a ord je přerušen nastavením cizího klíče ord.CustomerID na hodnotu null. Nezpůsobí odstranění řádku odpovídajícího ord.

LINQ to SQL provádí při odstranění objektu (DeleteOnSubmit) z tabulky následující zpracování:

  • Při SubmitChanges zavolání DELETE se pro tento objekt provede operace.

  • Odebrání není rozšířeno na související objekty bez ohledu na to, zda jsou načteny. Konkrétně související objekty nejsou načteny pro aktualizaci vlastnosti relace.

  • Po úspěšném spuštění SubmitChangesjsou objekty nastaveny na Deleted stav. V důsledku toho nelze použít objekt nebo jeho id v tom DataContext. Interní mezipaměť spravovaná DataContext instancí neodstraňují objekty, které jsou načteny nebo přidány jako nové, i po odstranění objektů v databázi.

Můžete volat DeleteOnSubmit pouze u objektu sledovaného objektem DataContext. U objektu Untracked je nutné volat Attach před voláním DeleteOnSubmit. Volání DeleteOnSubmit objektu Untracked vyvolá výjimku.

Poznámka:

Odebrání objektu z tabulky říká LINQ to SQL k vygenerování odpovídajícího příkazu SQL DELETE v době .SubmitChanges Tato akce neodebere objekt z mezipaměti ani nepromísí odstranění do souvisejících objektů.

K uvolnění id odstraněného objektu použijte novou DataContext instanci. K vyčištění souvisejících objektů můžete použít kaskádové odstranění databáze nebo jinak ručně odstranit související objekty.

Související objekty nemusí být odstraněny v žádném speciálním pořadí (na rozdíl od databáze).

Aktualizace objektů

Sledováním oznámení o změnách můžete zjistit Updates . Oznámení jsou poskytována PropertyChanging prostřednictvím události v setter vlastností. Když je linQ to SQL upozorněn na první změnu objektu, vytvoří kopii objektu a považuje objekt za kandidáta pro generování Update příkazu.

Pro objekty, které neimplementují INotifyPropertyChanging, LINQ to SQL udržuje kopii hodnot, které objekty měly při prvním materializaci. Při volání SubmitChanges, LINQ to SQL porovnává aktuální a původní hodnoty rozhodnout, zda byl objekt změněn.

U aktualizací relací je odkaz z podřízeného objektu na nadřazený objekt (tj. odkaz odpovídající cizímu klíči) považován za autoritu. Odkaz v opačném směru (tj. z nadřazeného na podřízené) je volitelný. Třídy relací (EntitySet<TEntity> a EntityRef<TEntity>) zaručují, že obousměrné odkazy jsou konzistentní pro relace 1:N a 1:1. Pokud objektový model nepoužívá EntitySet<TEntity> nebo EntityRef<TEntity>a pokud je k dispozici zpětný odkaz, je vaší zodpovědností udržet jej v souladu s odkazem vpřed při aktualizaci relace.

Pokud aktualizujete požadovaný odkaz i odpovídající cizí klíč, musíte se ujistit, že souhlasí. Výjimka InvalidOperationException je vyvolána, pokud dva nejsou synchronizovány v době, kdy voláte SubmitChanges. Přestože změny hodnoty cizího klíče jsou dostatečné pro ovlivnění aktualizace podkladového řádku, měli byste změnit odkaz na zachování připojení grafu objektu a obousměrné konzistence relací.

Viz také