Partage via


Dépannage

Les informations suivantes exposent quelques-uns des problèmes que vous pouvez rencontrer dans vos applications LINQ to SQL, et fournissent des suggestions pour les éviter, ou du moins en réduire l’effet.

D’autres problèmes sont traités dans Questions fréquentes (FAQ).

Opérateurs de requête standard non pris en charge

LINQ to SQL ne prend pas en charge toutes les méthodes d’opérateur de requête standard (par exemple ElementAt). En conséquence, les projets qui sont compilés peuvent produire des erreurs d'exécution. Pour plus d’informations, consultez Traduction des opérateurs de requête standard.

Problèmes de mémoire

Si une requête concerne une collection en mémoire et LINQ to SQL Table<TEntity>, cette requête peut être exécutée en mémoire, selon l’ordre dans lequel les deux collections sont spécifiées. Si la requête doit être exécutée dans la mémoire, les données de la table de base de données devront être extraites.

Cette approche est inefficace et peut se traduire par une utilisation significative de la mémoire et du processeur. Essayez d'éviter de telles requêtes multidomaines.

Noms de fichier et SQLMetal

Pour spécifier un nom de fichier d'entrée, ajoutez son nom à la ligne de commande comme fichier d'entrée. L’inclusion du nom de fichier dans la chaîne de connexion (avec l’option /conn ) n’est pas prise en charge. Pour plus d’informations, consultez SqlMetal.exe (outil de génération de code).

Projets de bibliothèque de classe

Le Concepteur Objet Relationnel crée une chaîne de connexion dans le fichier app.config du projet. Dans les projets de bibliothèque de classes, le fichier app.config n'est pas utilisé. LINQ to SQL utilise la chaîne de connexion fournie dans les fichiers au moment de la conception. La modification de la valeur dans app.config ne modifie pas la base de données à laquelle votre application se connecte.

Suppression en cascade

LINQ to SQL ne prend pas en charge ni ne reconnaît les opérations de suppression en cascade. Si vous souhaitez supprimer une ligne dans une table comportant des contraintes sur cette suppression, vous devez effectuer l'une des actions suivantes :

  • Définissez la règle ON DELETE CASCADE dans la contrainte de clé étrangère dans la base de données.

  • Utilisez votre propre code pour supprimer en premier les objets enfants qui empêchent la suppression de l'objet parent.

Sinon, une exception SqlException est levée.

Pour plus d’informations, consultez Guide pratique pour supprimer des lignes de la base de données.

Expression non requêtable

Si vous obtenez l'erreur "L'expression de type [expression] ne peut pas être interrogée. Vérifiez que vous n'omettez pas une référence d'assembly et/ou une importation d'espace de noms pour le fournisseur LINQ.", vérifiez que :

  • Votre application cible .NET Compact Framework 3.5.

  • Il y a une référence à System.Core.dll et System.Data.Linq.dll.

  • Vous avec une directive Imports (Visual Basic) ou using (C#) pour System.Linq et System.Data.Linq.

DuplicateKeyException

Lors du débogage d’un projet LINQ to SQL, vous êtes susceptible de parcourir les relations d’une entité. Ceci place ces éléments dans le cache et LINQ to SQL est informé de leur présence. Si vous tentez ensuite d'exécuter Attach ou InsertOnSubmit ou une méthode similaire qui produit plusieurs lignes ayant la même clé, une DuplicateKeyException est levée.

Exceptions de concaténation de chaînes

La concaténation sur les opérandes mappées à [n]text et d'autre [n][var]char n'est pas prise en charge. Une exception est levée en cas de concaténation de chaînes mappée à deux ensembles de types différents. Pour plus d’informations, consultez Méthodes System.String.

Exceptions d'ignorance (Skip) et d'acceptation (Take) dans SQL Server 2000

Vous devez utiliser des membres d'identité (IsPrimaryKey) lorsque vous utilisez Take ou Skip sur une base de données Microsoft SQL Server 2000. La requête doit être effectuée sur une table unique (c'est-à-dire, pas une jointure) ou il doit s'agir d'une opération Distinct, Except, Intersect ou Union, et elle ne doit pas inclure d'opération Concat. Pour plus d’informations, consultez la section « Prise en charge de SQL Server 2000 » dans Traduction des opérateurs de requête standard.

Cette spécification ne s’applique pas à SQL Server 2005.

GroupBy InvalidOperationException

Cette exception est levée lorsqu'une valeur de colonne est null dans une requête GroupBy regroupée par une expression boolean, telle que group x by (Phone==@phone). Comme l’expression est un boolean, il est inféré que la clé est boolean, et non pas nullableboolean. Quand la comparaison traduite produit une valeur Null, une tentative est faite d’affecter un nullableboolean à un boolean, et l’exception est alors levée.

Pour éviter cette situation (en supposant que vous souhaitiez traiter les valeurs null comme des valeurs false), utilisez, par exemple, la méthode suivante :

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

Méthode partielle OnCreated()

La méthode OnCreated() générée est appelée chaque fois que le constructeur d’objet est appelé, y compris dans le cas où LINQ to SQL appelle le constructeur pour faire une copie pour les valeurs d’origine. Tenez compte de ce comportement si vous implémentez la méthode OnCreated() dans votre propre classe partielle.

Voir aussi