Sdílet prostřednictvím


Řešení potíží

Následující informace zveřejňují některé problémy, se kterými se můžete setkat ve svých LINQ to SQL aplikacích, a nabízejí návrhy, jak se těmto problémům vyhnout nebo je jinak snížit.

Další problémy jsou vyřešeny v části Nejčastější dotazy.

Nepodporované standardní operátory dotazů

LINQ to SQL nepodporuje všechny standardní metody operátorů dotazů (například ElementAt). V důsledku toho můžou kompilované projekty stále způsobovat chyby za běhu. Další informace najdete v tématu Překlad standardního operátora dotazu.

Problémy s pamětí

Pokud dotaz zahrnuje kolekci v paměti a LINQ to SQL Table<TEntity>, může být dotaz proveden v paměti v závislosti na pořadí, ve kterém jsou tyto dvě kolekce zadány. 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ýraznému využití paměti a procesoru. Snažte se těmto vícedoménovým dotazům zabránit.

Názvy souborů a SQLMetal

Chcete-li zadat název vstupního souboru, přidejte název souboru 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ář relací objektů vytvoří připojovací řetězec v app.config souboru projektu. V projektech knihovny tříd se app.config soubor nepoužívá. LINQ to SQL používá připojovací řetězec, který je k dispozici v souborech v době návrhu. Změnou hodnoty v app.config se nezmění databáze, ke které se vaše aplikace připojuje.

Kaskádové odstranění

LINQ to SQL nepodporuje ani nerozpoznává operace kaskádového odstranění. Pokud chcete odstranit řádek v tabulce, který má omezení, 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ě dojde k výjimce SqlException .

Další informace najdete v tématu Postupy: Odstranění řádků z databáze.

Výraz nejde dotazovat

Pokud se zobrazí výraz [expression] nelze dotazovat; Chybí vám odkaz na sestavení?" a ujistěte se, že:

  • 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

Během ladění projektu LINQ to SQL můžete procházet vztahy entity. Tím se tyto položky přenese do mezipaměti a LINQ to SQL o jejich přítomnosti. Pokud se pak pokusíte provést Attach nebo InsertOnSubmit podobnou metodu, která vytvoří více řádků se stejným klíčem, DuplicateKeyException je vyvolán .

Výjimky zřetězení řetězců

Zřetězení operandů namapovaných na [n]text a jiné [n][var]char není podporováno. Výjimka je vyvolána pro zřetězení řetězců mapovaných na dvě různé sady typů. Další informace najdete v tématu Metody System.String.

Skip and Take Exceptions in SQL Server 2000

Při použití Take nebo Skip pro databázi SQL Server 2000 musíte použít členy identity (IsPrimaryKey). Dotaz musí být proti jedné tabulce (to znamená, že není spojení) nebo musí být Distinctoperace , Except, Intersectnebo Union a nesmí obsahovat Concat operaci. Další informace najdete v části Podpora SQL Server 2000 v tématu Překlad standardního operátora dotazu.

Tento požadavek se nevztahuje na SQL Server 2005.

GroupBy InvalidOperationException

Tato výjimka se vyvolá, když má hodnota sloupce hodnotu 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íč se odvozuje tak, aby byl boolean, nikoli nullableboolean. Když přeložené porovnání vytvoří hodnotu null, provede se pokus o přiřazení nullableboolean k objektu booleana dojde k výjimce.

Pokud se chcete této situaci vyhnout (za předpokladu, že chcete považovat hodnoty null za nepravdivé), použijte například následující postup:

GroupBy="(Phone != null) && (Phone=@Phone)"

OnCreated() Partial – metoda

Vygenerovaná metoda OnCreated() je volána při každém volání konstruktoru objektu, včetně scénáře, ve kterém LINQ to SQL volání konstruktoru vytvořit kopii pro původní hodnoty. Toto chování vezměte v úvahu, pokud implementujete metodu OnCreated() ve vlastní částečné třídě.

Viz také