Ř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
aSystem.Data.Linq.dll
.Máte direktivu
Imports
(Visual Basic) nebousing
(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 nullable
boolean
. Když přeložené porovnání vytvoří hodnotu null, provede se pokus o přiřazení nullable
boolean
k objektu boolean
a 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ě.