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.
Následující informace zpřístupňují některé problémy, se kterými se můžete setkat v aplikacích LINQ to SQL, a poskytují návrhy, abyste se vyhnuli nebo jinak snížili účinek těchto problémů.
Další problémy jsou vyřešeny v nejčastějších dotazech.
Nepodporované standardní operátory dotazů
LINQ to SQL nepodporuje všechny standardní metody operátoru dotazu (například ElementAt). V důsledku toho můžou projekty, které kompilují, stále způsobit chyby za běhu. Další informace naleznete v tématu Standardní překlad operátoru dotazu.
Problémy s pamětí
Pokud dotaz zahrnuje kolekci v paměti a LINQ to SQL Table<TEntity>, může se dotaz spustit v paměti v závislosti na pořadí, ve kterém jsou uvedené dvě kolekce. Pokud se dotaz musí spustit v paměti, bude potřeba načíst data z tabulky databáze.
Tento přístup je neefektivní a může vést k významnému využití paměti a procesoru. Snažte se takovým vícedoménovým dotazům zabránit.
Názvy souborů a SQLMetal
Pokud chcete zadat název vstupního souboru, přidejte ho do příkazového řádku jako vstupní soubor. Zahrnutí názvu souboru do připojovacího řetězce (pomocí možnosti /conn ) se nepodporuje. Další informace najdete v tématu SqlMetal.exe (nástroj pro generování kódu).
Projekty knihovny tříd
Návrhář relačních objektů vytvoří připojovací řetězec v app.config souboru projektu. V projektech knihoven tříd se soubor app.config nepoužívá. LINQ to SQL používá připojovací řetězec zadaný v souborech návrhu. Změna hodnoty app.config v databázi, ke které se vaše aplikace připojuje, nezmění.
Kaskádové odstranění
LINQ to SQL nepodporuje ani nerozpozná operace kaskádového odstranění. Pokud chcete odstranit řádek v tabulce s omezeními, musíte udělat jednu z těchto věcí:
ON DELETE CASCADENastavte pravidlo v omezení cizího klíče v databázi.Pomocí vlastního kódu nejprve odstraňte podřízené objekty, které brání odstranění nadřazeného objektu.
V opačném případě je vyvolána výjimka.
Další informace naleznete v tématu Postupy: Odstranění řádků z databáze.
Výraz nelze dotazovat
Pokud se zobrazí chyba "Výraz [výraz] nelze dotazovat; možná chybí odkaz na sestavení?", ujistěte se o následujícím:
Vaše aplikace cílí na .NET Compact Framework 3.5.
Máte odkaz na
System.Core.dllaSystem.Data.Linq.dll.Máte direktivu
Imports(Visual Basic) nebousing(C#) pro System.Linq a System.Data.Linq.
DuplicateKeyException
V průběhu ladění projektu LINQ to SQL můžete procházet vztahy mezi entitou. Tím se tyto položky přenese do mezipaměti a LINQ to SQL si uvědomí o jejich přítomnosti. Pokud se pak pokusíte provést Attach nebo InsertOnSubmit nebo podobnou metodu, která vytvoří více řádků se stejným klíčem, DuplicateKeyException se vyvolá.
Výjimky zřetězení řetězců
Zřetězení operací na operandech mapovaných na [n]text a jiné [n][var]char se nepodporuje. Pro spojování řetězců, které jsou mapovány na dvě různé množiny typů, se vyvolá výjimka. Další informace naleznete v tématu Metody System.String.
Přeskakování a zpracovávání výjimek v SQL Server 2000
Členy identity (IsPrimaryKey) musíte používat, když používáte Take nebo Skip pro databázi SQL Server 2000. Dotaz musí být v jedné tabulce (to znamená, že se nejedná o spojení) nebo musí jít o operaci Distinct, Except, Intersect nebo Union a nesmí obsahovat operaci Concat. Další informace najdete v části Podpora SQL Serveru 2000 v překladu standardního operátoru dotazu.
Tento požadavek se nevztahuje na SQL Server 2005.
Výjimka GroupBy InvalidOperationException
Tato výjimka se vyvolá v případě, že hodnota sloupce je null v GroupBy dotazu, který seskupuje podle výrazu boolean , například group x by (Phone==@phone). Vzhledem k tomu, že výraz je boolean, klíč je odvozen jako boolean, nikoli nullableboolean. Když přeložené porovnání vytvoří null, provede se pokus o přiřazení nullableboolean do boolean a vyvolá se výjimka.
Chcete-li se této situaci vyhnout (za předpokladu, že chcete považovat hodnoty null za false), použijte například následující přístup:
GroupBy="(Phone != null) && (Phone=@Phone)"
Metoda OnCreated() Partial
Vygenerovaná metoda OnCreated() se volá při každém volání konstruktoru objektu, včetně scénáře, ve kterém LINQ to SQL volá konstruktor, aby vytvořil kopii pro původní hodnoty. Toto chování vezměte v úvahu, pokud implementujete metodu OnCreated() ve své vlastní částečné třídě.