Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
LINQ to SQL objekty se vždy účastní určitého 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. Mezi příklady patří: – Objekt, na který se nedotazuje prostřednictvím aktuálního DataContext (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 a není známo, že od svého vytvoření byl 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 získán pomocí aktuálního DataContext. Toto způsobí INSERT v databázi během SubmitChanges. |
ToBeUpdated |
Objekt, o který se vědělo, že byl změněn od svého získání. Toto způsobí UPDATE v databázi 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 výslovně 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 Untracked do objektu EntitySet<TEntity> nebo nastavíte EntityRef<TEntity> na objekt Untracked, zpřístupníte objekt Untracked prostřednictvím sledovaných objektů v 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 (InsertOnSubmit) také nastaví hodnotu člena určeného jako o tak, aby 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ý do Table 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> za aktualizační operaci a odpovídající hodnota cizího klíče je nastavena na 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í:
Když se SubmitChanges zavolá, provede se operace
DELETEpro tento objekt.Odstranění se nešíří 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
Deletedstav. V důsledku toho nelze použít objekt nebo jehoidv 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. Vyvolání DeleteOnSubmit na objektu Untracked vyvolá výjimku.
Poznámka:
Odebrání objektu z tabulky znamená, že LINQ to SQL vygeneruje odpovídající příkaz SQL DELETE v čase SubmitChanges. Tato akce neodebere objekt z mezipaměti ani nešíří smazání na související objekty.
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 prostřednictvím události PropertyChanging v nastavovači 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 jejich první materializaci. Při volání SubmitChanges LINQ to SQL porovnává aktuální a původní hodnoty, aby rozhodl, zda byl objekt změněn.
U aktualizací relací je považován za autoritu odkaz z potomka na rodiče (tj. odkaz odpovídající cizímu klíči). Odkaz v opačném směru (tj. od nadřazeného k podřízenému) 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 ti dva nebudou synchronizováni v době, kdy použijete SubmitChanges. Přestože změny hodnot cizích klíčů postačují k ovlivnění aktualizace základního řádku, měli byste změnit referenci, abyste zachovali propojení objektového grafu a obousměrnou konzistenci vztahů.