Colonnes XML dans une application Code-First

J’essaie de créer une colonne XML dans Code First. Je sais bien qu’Entity Framework ne prend pas complètement en charge les colonnes XML et qu’il les lit sous forme de chaîne. C’est très bien. J’aimerais quand même que le type de colonne soit XML, cependant. Voici ma classe:

class Content { public int ContentId { get; set; } [Column(TypeName="xml")] public ssortingng XmlSsortingng { get; set; } [NotMapped] public XElement Xml { get { ... } set { ... } } } 

Le problème est que Code First Migrations ignore complètement l’atsortingbut Column et crée le champ en tant que nvarchar(max) . J’ai essayé d’utiliser [DataType("xml")] , mais cela aussi ne fonctionnait pas.

Est-ce un bug de migration?

As-tu essayé:

 public Ssortingng XmlContent { get; set; } public XElement XmlValueWrapper { get { return XElement.Parse(XmlContent); } set { XmlContent = value.ToSsortingng(); } } public partial class XmlEntityMap : EntityTypeConfiguration { public XmlEntityMap() { // ... this.Property(c => c.XmlContent).HasColumnType("xml"); this.Ignore(c => c.XmlValueWrapper); } } 

J’ai réalisé ce qui est nécessaire avec un atsortingbut et j’ai décoré mon champ xml de classe de modèle avec l’atsortingbut.

 [XmlType] public ssortingng XmlSsortingng { get; set; } [NotMapped] public XElement Xml { get { return !ssortingng.IsNullOrWhiteSpace(XmlSsortingng) ? XElement.Parse(XmlSsortingng) : null; } set { XmlSsortingng = value == null ? null : value.ToSsortingng(SaveOptions.DisableFormatting); } } 

Vous avez l’aide de ces 2 articles:

https://entityframework.codeplex.com/wikipage?title=Code%20First%20Annotations

https://andy.mehalick.com/2014/02/06/ef6-adding-a-created-datetime-column-automatically-with-code-first-migrations/

Solution

Définir l’atsortingbut

 [AtsortingbuteUsage(AtsortingbuteTargets.Property, AllowMultiple = false)] public class XmlType : Atsortingbute { } 

Enregistrer l’atsortingbut dans le contexte

Dans le “OnModelCreating” du contexte

 modelBuilder.Conventions.Add(new AtsortingbuteToColumnAnnotationConvention("XmlType", (p, atsortingbutes) => "xml")); 

Générateur SQL personnalisé

 public class CustomSqlGenerator : SqlServerMigrationSqlGenerator { protected override void Generate(ColumnModel column, IndentedTextWriter writer) { SetColumnDataType(column); base.Generate(column, writer); } private static void SetColumnDataType(ColumnModel column) { // xml type if (column.Annotations.ContainsKey("XmlType")) { column.StoreType = "xml"; } } } 

Enregistrer un générateur SQL personnalisé

Dans le constructeur Configuration de la migration, enregistrez le générateur SQL personnalisé.

  SetSqlGenerator("System.Data.SqlClient", new CustomSqlGenerator()); 

Mais que se passe-t-il si XmlContent est null ??

Peut être :

  public XElement XmlValueWrapper { get { return XmlContent != null ? XElement.Parse(XmlContent) : null; } set { XmlContent = value.ToSsortingng(); } }