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 Untracked
EntityRef<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 jehoid
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í.