Problemen oplossen
De volgende informatie bevat enkele problemen die u kunt tegenkomen in uw LINQ to SQL-toepassingen en biedt suggesties om het effect van deze problemen te voorkomen of anderszins te verminderen.
Aanvullende problemen worden behandeld in Veelgestelde vragen.
Niet-ondersteunde standaardqueryoperators
LINQ to SQL biedt geen ondersteuning voor alle standaardqueryoperatormethoden (bijvoorbeeld ElementAt). Als gevolg hiervan kunnen gecompileerd projecten nog steeds runtimefouten veroorzaken. Zie Standard Query Operator Translation (Standard Query Operator Translation) voor meer informatie.
Geheugenproblemen
Als een query een in-memory verzameling en LINQ to SQL Table<TEntity>bevat, kan de query worden uitgevoerd in het geheugen, afhankelijk van de volgorde waarin de twee verzamelingen zijn opgegeven. Als de query in het geheugen moet worden uitgevoerd, moeten de gegevens uit de databasetabel worden opgehaald.
Deze aanpak is inefficiënt en kan leiden tot een aanzienlijk geheugen- en processorgebruik. Probeer dergelijke query's met meerdere domeinen te vermijden.
Bestandsnamen en SQLMetal
Als u een naam voor het invoerbestand wilt opgeven, voegt u de naam toe aan de opdrachtregel als het invoerbestand. Het opnemen van de bestandsnaam in de connection string (met behulp van de optie /conn) wordt niet ondersteund. Zie SqlMetal.exe (hulpprogramma voor het genereren van code) voor meer informatie.
Klassebibliotheekprojecten
De Object Relational Designer maakt een connection string in het app.config
bestand van het project. In klassebibliotheekprojecten wordt het app.config
bestand niet gebruikt. LINQ to SQL gebruikt de verbindingsreeks die is opgegeven in de ontwerptijdbestanden. Als u de waarde in app.config
wijzigt, wordt de database waarmee uw toepassing verbinding maakt, niet gewijzigd.
Trapsgewijs verwijderen
LINQ to SQL biedt geen ondersteuning voor of herkent geen bewerkingen voor trapsgewijs verwijderen. Als u een rij in een tabel met beperkingen wilt verwijderen, moet u een van de volgende handelingen uitvoeren:
Stel de
ON DELETE CASCADE
regel in de beperking refererende sleutel in de database in.Gebruik uw eigen code om eerst de onderliggende objecten te verwijderen die verhinderen dat het bovenliggende object wordt verwijderd.
Anders wordt er een SqlException uitzondering gegenereerd.
Zie Procedure: Rijen verwijderen uit de database voor meer informatie.
Expressie kan niet worden opgevraagd
Als u de 'Expressie [expressie] kan niet worden opgevraagd; Ontbreekt er een assembly-verwijzing?', controleert u het volgende:
Uw toepassing is gericht op .NET Compact Framework 3.5.
U hebt een verwijzing naar
System.Core.dll
enSystem.Data.Linq.dll
.U hebt een
Imports
(Visual Basic) ofusing
(C#) -instructie voor System.Linq en System.Data.Linq.
DuplicateKeyException
Tijdens het opsporen van fouten in een LINQ to SQL-project, kunt u de relaties van een entiteit doorkruisen. Als u dit doet, worden deze items in de cache geplaatst en wordt LINQ to SQL zich bewust van hun aanwezigheid. Als u vervolgens probeert uit te voeren Attach of InsertOnSubmit een vergelijkbare methode die meerdere rijen met dezelfde sleutel produceert, wordt een DuplicateKeyException gegenereerd.
Uitzonderingen voor samenvoeging van tekenreeksen
Samenvoeging van operanden die zijn toegewezen aan [n]text
en andere [n][var]char
wordt niet ondersteund. Er wordt een uitzondering gegenereerd voor het samenvoegen van tekenreeksen die zijn toegewezen aan de twee verschillende sets typen. Zie System.String Methods (System.String-methoden) voor meer informatie.
Uitzonderingen overslaan en maken in SQL Server 2000
U moet identiteitsleden (IsPrimaryKey) gebruiken wanneer u Take of Skip gebruikt voor een SQL Server 2000-database. De query moet betrekking hebben op één tabel (dus geen join) of een Distinctbewerking , Except, Intersectof Union en mag geen bewerking bevatten Concat . Zie de sectie 'SQL Server 2000 Support' in Standard Query Operator Translation (Standard Query Operator Translation) voor meer informatie.
Dit geldt niet voor SQL Server 2005.
GroupBy InvalidOperationException
Deze uitzondering wordt gegenereerd wanneer een kolomwaarde null is in een GroupBy query die wordt gegroepeerd op basis van een boolean
expressie, zoals group x by (Phone==@phone)
. Omdat de expressie een boolean
is, wordt de sleutel afgeleid als boolean
, niet nullable
boolean
. Wanneer de vertaalde vergelijking een null produceert, wordt een poging gedaan om een nullable
boolean
toe te wijzen aan een boolean
en wordt de uitzondering gegenereerd.
Als u deze situatie wilt voorkomen (ervan uitgaande dat u null-waarden als onwaar wilt behandelen), gebruikt u een methode zoals de volgende:
GroupBy="(Phone != null) && (Phone=@Phone)"
Gedeeltelijke methode OnCreated()
De gegenereerde methode OnCreated()
wordt aangeroepen telkens wanneer de objectconstructor wordt aangeroepen, inclusief het scenario waarin LINQ to SQL de constructor aanroept om een kopie te maken voor de oorspronkelijke waarden. Neem dit gedrag in aanmerking als u de OnCreated()
methode in uw eigen gedeeltelijke klasse implementeert.