Řešení problémů

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 CASCADE Nastavte 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.dll a System.Data.Linq.dll.

  • Máte direktivu Imports (Visual Basic) nebo using (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ě.

Viz také