/ / Comment spécifier le type de données XML SQL Server dans le modèle Entity Frameworks 4.0? - .net, xml, entity-framework, entity-framework-4

Comment spécifier le type de données SQL Server XML dans le modèle Entity Frameworks 4.0? - .net, xml, entity-framework, entity-framework-4

Je construis un ORM en utilisant Entity Frameworks 4.0 (CTP5) dans le modèle Modèle en premier. Certaines de mes entités possèdent des propriétés complexes (arborescence d'objets) qui ne doivent pas nécessairement être des entités ORM. Elles ne concernent que les systèmes de serveur d'arrière-plan qui utilisent cette base de données, pas les clients qui l'utilisent.

Je pourrais simplement sérialiser l’arborescence des objets de la propriétéjusqu'à une chaîne et la stocker dans la base de données sous la forme d'une chaîne, mais le type de données XML SQL Server est vraiment attrayant. Il serait très agréable de pouvoir interroger le contenu des données XML de manière intelligente.

Cependant, je ne vois aucun moyen de spécifier que je souhaite un type de données XML dans Visual Studio Entity Modeler.

Est-ce la seule façon de faire cela pour spécifierLes champs de chaîne dans le modèle, émettent le DDL, puis modifient le DDL pour changer les champs de chaîne en champs XML? Cela semble terriblement fragile et une fois, changez jamais. Y a-t-il un meilleur moyen?

Réponses:

9 pour la réponse № 1

Dans "Recettes Entity Framework 4.0", Larry Tenny et Zeeshan Hirani déclarent que les types de données XML ne sont tout simplement pas pris en charge par EF 4.0.

Ils offrent une solution de contournement, qui consiste à faire laPropriété de type chaîne sur la classe d'entité générée par le modèle privé et créer une nouvelle propriété (dans votre propre classe partielle de la classe d'entité) pour renvoyer un XElement à partir de la propriété de chaîne interne:

public partial class Candidate
{
private XElement candidateResume = null;

public XElement CandidateResume
{
get
{
if (candidateResume == null)
{
candidateResume = XElement.Parse(this.Resume);
candidateResume.Changed += (s,e) =>
{
this.Resume = candidateResume.ToString();
}
}

return candidateResume;
}

set
{
candidateResume = value;
candidateResume.Changed += (s,e) =>
{
this.Resume = candidateResume.ToString();
}
this.Resume = value.ToString();
}
}
}

Création d'une propriété shadow du XML souhaitétaper comme ceci devrait fonctionner, mais la conversion entre chaîne et XML à chaque changement de la propriété de chaîne d'origine (Resume) et de la nouvelle propriété shadow (CandidateResume) est assez coûteuse.

Si quelqu'un a de meilleures idées, je suis toujours ouvert aux suggestions.


0 pour la réponse № 2

J'ai "trouvé un moyen de masquer le fait que EntityFramework mappe la propriété XML à une propriété String, en utilisant un type complexe masqué. Bien que cela nécessite que vous modifiiez chaque entité affectée avant de l’enregistrer dans la base de données. En gros, j'utilise le fait qu'Entity Framework vous permet de spécifier les types internes dans votre fichier .csdl.

Je décris mon approche un peu en détail ici: Comparaison ORM .net

Je viens également d'installer le CTP5 pour jeter un coup d'œil àl'approche code-first, pour voir si la même approche peut être utilisée sans un fichier .edmx ou .csdl. Je modifierai cette réponse si j’ai trouvé un autre moyen.