Dela via


Felsökning

Följande information visar några problem som kan uppstå i dina LINQ to SQL-program och innehåller förslag för att undvika eller på annat sätt minska effekten av dessa problem.

Ytterligare problem åtgärdas i Vanliga frågor och svar.

Standardfrågeoperatorer som inte stöds

LINQ to SQL stöder inte alla standardmetoder för frågeoperatorer (till exempel ElementAt). Därför kan projekt som kompileras fortfarande generera körningsfel. Mer information finns i Standard Query Operator Translation (Standard Query Operator Translation).

Minnesproblem

Om en fråga omfattar en minnesintern samling och LINQ to SQL Table<TEntity>kan frågan köras i minnet, beroende på i vilken ordning de två samlingarna anges. Om frågan måste köras i minnet måste data från databastabellen hämtas.

Den här metoden är ineffektiv och kan resultera i betydande minnes- och processoranvändning. Försök att undvika sådana frågor med flera domäner.

Filnamn och SQLMetal

Om du vill ange ett indatafilnamn lägger du till namnet på kommandoraden som indatafil. Det går inte att inkludera filnamnet i anslutningssträngen (med alternativet /conn ). Mer information finns iSqlMetal.exe (Kodgenereringsverktyg).

Klassbiblioteksprojekt

Objektrelationsdesignern skapar en anslutningssträng i app.config projektets fil. I klassbiblioteksprojekt app.config används inte filen. LINQ to SQL använder anslutningssträngen som anges i designtidsfilerna. Om du ändrar värdet i app.config ändras inte databasen som programmet ansluter till.

Ta bort överlappande

LINQ to SQL stöder eller känner inte igen åtgärder för kaskadborttagning. Om du vill ta bort en rad i en tabell som har begränsningar mot den, måste du göra något av följande:

  • ON DELETE CASCADE Ange regeln i villkoret sekundärnyckel i databasen.

  • Använd din egen kod för att först ta bort underordnade objekt som förhindrar att det överordnade objektet tas bort.

Annars utlöses ett SqlException undantag.

Mer information finns i Så här tar du bort rader från databasen.

Uttrycket är inte frågebart

Om du får uttrycket [expression] är inte frågebart. saknar du en sammansättningsreferens?" fel, kontrollera följande:

  • Ditt program är inriktat på .NET Compact Framework 3.5.

  • Du har en referens till System.Core.dll och System.Data.Linq.dll.

  • Du har ett Imports (Visual Basic) eller using (C#)-direktiv för System.Linq och System.Data.Linq.

DuplicateKeyException

Under felsökningen av ett LINQ to SQL projekt kan du gå igenom en entitets relationer. På så sätt kommer dessa objekt till cachen och LINQ to SQL blir medvetna om deras närvaro. Om du sedan försöker köra Attach eller InsertOnSubmit en liknande metod som producerar flera rader som har samma nyckel genereras en DuplicateKeyException .

Undantag för sammanfogning av strängar

Sammanfogning på operander som mappas till [n]text och andra [n][var]char stöds inte. Ett undantag genereras för sammanfogning av strängar som mappats till de två olika typerna. Mer information finns i System.String-metoder.

Hoppa över och ta undantag i SQL Server 2000

Du måste använda identitetsmedlemmar (IsPrimaryKey) när du använder Take eller Skip mot en SQL Server 2000-databas. Frågan måste vara mot en enda tabell (dvs. inte en koppling) eller vara en Distinct, Except, Intersect, eller Union åtgärd och får inte innehålla en Concat åtgärd. Mer information finns i avsnittet "SQL Server 2000 Support" i Standard Query Operator Translation( Standard Query Operator Translation).

Detta krav gäller inte för SQL Server 2005.

GroupBy InvalidOperationException

Det här undantaget utlöses när ett kolumnvärde är null i en GroupBy fråga som grupperas efter ett boolean uttryck, till exempel group x by (Phone==@phone). Eftersom uttrycket är en boolean, härleds nyckeln till boolean, inte nullableboolean. När den översatta jämförelsen ger en null görs ett försök att tilldela en nullableboolean till en boolean, och undantaget genereras.

Om du vill undvika den här situationen (förutsatt att du vill behandla null-värden som falskt) använder du en metod som följande:

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

OnCreated() Partiell metod

Den genererade metoden OnCreated() anropas varje gång objektkonstruktorn anropas, inklusive scenariot där LINQ to SQL anropar konstruktorn för att göra en kopia för ursprungliga värden. Ta hänsyn till det här beteendet om du implementerar OnCreated() metoden i din egen partiella klass.

Se även