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
[AtsortingbuteUsage(AtsortingbuteTargets.Property, AllowMultiple = false)] public class XmlType : Atsortingbute { }
Dans le “OnModelCreating” du contexte
modelBuilder.Conventions.Add(new AtsortingbuteToColumnAnnotationConvention("XmlType", (p, atsortingbutes) => "xml"));
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"; } } }
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(); } }