Suppression d'éléments (BindingSource et Linq2Sql)
Récemment, j'ai été confronté à un problème de suppression d'un enregistrement par le biais d'une BindingSource liée à un DataContext (en Linq-To-Sql) : il s'agissait d'un enregistrement issu d'une table de relation (1,n ; n,1).
J'utilisais la méthode bs.RemoveCurrent, et l'erreur suivante se déclenchait sur l'exécution de dc.SubmitChanges :
"Une tentative a été faite pour supprimer une relation entre {0} et {1}. Toutefois, l'une des clés étrangères de la relation ({2}) ne peut pas avoir la valeur null."
Une recherche de solution à ce problème me menait finalement au blog de Beth Massi.
Les 2 solutions possibles sont :
1. Accepter les suppressions en cascade dans les associations de table.
2. (Solution retenue) Accéder au .dbml du projet, l'ouvrir dans un éditeur xml, et ajouter la balise DeleteOnNull="true" à la ligne décrivant l'association en question.
Autre fil intéressant à explorer : http://stackoverflow.com/questions/384755/linq-to-sql-one-to-many-databinding-deleting-problem
Cependant, si le Child est issu d'une table de liaison (table de cardinalité n x m), et que la clef primaire de cette table est constituée de la clef primaire de la table1 et de la clef primaire de la table2, alors aucun correctif cité ci-dessus ne s'applique ; le message d'erreur apparaîtra continuellement.
Le correctif qui fonctionne consiste à définir une clef primaire à un seul champ pour cette table, en plus des clefs étrangères qui ne seront plus clefs primaires dans cette table. Mais cela alourdit la gestion.
Le plus important finalement, est de remarquer que ce problème existe avec Linq-To-Sql, mais pas avec Entity Framework !