Linq-to-SQL avec des champs de firebase database XML – Pourquoi cela fonctionne-t-il?

Un peu d’arrière-plan: j’ai une firebase database que je veux utiliser linq-to-SQL pour mettre à jour via une application C # Une des colonnes de cette table a un type de données XML.

Toutes les autres colonnes de cette table (qui ne sont pas d’un type de données XML) sont parfaitement mises à jour, mais lorsque je dois modifier le champ XML, le programme s’exécute (apparemment) correctement, mais le champ conserve toujours sa valeur d’origine après Exécutez SubmitChanges() .

J’ai regardé sur Internet et trouvé quelques articles sur Microsoft Connect qui diagnostiquaient des problèmes similaires et suis finalement tombé sur la solution ici :

Pour forcer la mise à jour du champ XML, cela ne suffit pas:

 XElement tmp = MyLinqObject.XmlField; MyLinqObject.XmlField = null; MyLinqObject.XmlField = tmp; 

Au lieu de cela, pour forcer LINQ à mettre à jour la colonne XML, affectez un object cloné:

 MyLinqObject.XmlField = new XElement (MyLinqObject.XmlField); 

Je peux confirmer que cela semble effectivement fonctionner, mais je ne sais pas trop pourquoi. Ma seule hypothèse est que la propriété XmlField a une sorte d’identifiant unique sur le tas et qu’en créant un clone, vous lui avez atsortingbué un nouvel identifiant unique. Lorsque Linq génère ensuite la requête, il n’essaie même pas de voir si le champ a été mis à jour, car il possède un nouvel identifiant, il écrit simplement la valeur dans la firebase database. Mais je spécule simplement et espère que quelqu’un d’autre pourra fournir une meilleure compréhension de ce qui se passe dans les coulisses.

EDIT : Pour répondre au message de Jon, la raison du problème (comme expliqué sur le site MS Connect) est que “le champ XML ne se met pas à jour car Linq-to-SQL ne gère pas l’événement XElement.Changed”.

Pour ma mise en œuvre, le code qui fonctionne finit par ressembler à ceci:

 MyXElementProperty.SetElementValue("Author", author); MyXElementProperty = new XElement(MyXElementProperty); 

Pour référence (à quiconque trouve cette question), fonctionne également:

 MyXElementProperty = new XElement(MyXElementProperty); MyXElementProperty.SetElementValue("Author", author); 

Lorsque vous en faites un nouveau XElement , vous XElement un object différent. Il est possible que, pour détecter le “manque”, il utilise une égalité de référence, qui traiterait évidemment cela comme une nouvelle valeur.

À quel moment apportez-vous des modifications à l’élément? Je m’attendrais à ce que LINQ to SQL ait une copie en cache de la valeur d’origine, puis la compare à la nouvelle valeur. Si vous prenez cette “copie en cache” en copiant simplement la référence, quoi que vous fassiez pour cet object, il pensera toujours que les deux sont égaux. Si, au lieu de cela, vous créez un nouvel élément, puis le modifiez, l’ancien object conserve son ancienne valeur. La comparaison comprendra donc que vous avez apporté des modifications. Cela a-t-il du sens?

Il s’agissait d’une solution de contournement très «différente». J’ai passé un certain temps à essayer de comprendre pourquoi le champ XML de la firebase database n’était pas téléchargé. Le nouveau XElement (updatedXElement) a également fonctionné pour moi!