Partager via


Dépannage (LINQ to SQL)

Mise à jour : November 2007

Les informations suivantes exposent quelques 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 Forum Aux Questions (LINQ to SQL).

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<TSource>). 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 (LINQ to SQL).

Problèmes de mémoire

Si une requête concerne une collection en mémoire et LINQ to SQLTable<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 (à l'aide de l'option /conn) n'est pas prise en charge. Pour plus d'informations, consultez Outil de génération de code (SqlMetal.exe).

Projets de bibliothèque de classe

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 du design. 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 Procédure : supprimer des lignes de la base de données (LINQ to SQL).

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.

  • Il y a 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, il est possible que vous parcouriez les relations d'une entité. Si c'est le cas, ces éléments sont envoyés 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 (LINQ to SQL).

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

Vous devez utiliser des membres d'identité (IsPrimaryKey) lorsque vous utilisez Take<TSource> ou Skip<TSource> 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<TSource>. Pour plus d'informations, consultez la section "Prise en charge de SQL Server 2000" dans Traduction des opérateurs de requête standard (LINQ to SQL).

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). L'expression étant boolean, la clé doit donc être boolean, et non nullableboolean. Lorsque la comparaison traduite produit un null, une tentative est faite pour assigner un nullableboolean à un boolean, et l'exception est 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 générée OnCreated() 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

Concepts

Forum Aux Questions (LINQ to SQL)

Autres ressources

Prise en charge du débogage (LINQ to SQL)