I\'m trying to create an XML column in Code First. I\'m well aware Entity Framework doesn\'t fully support XML columns, and that it reads them as a string. That\'s fine. I w
I achieved what is needed with an attribute and I decorated my model class xml field with the attribute.
[XmlType]
public string XmlString { get; set; }
[NotMapped]
public XElement Xml
{
get { return !string.IsNullOrWhiteSpace(XmlString) ? XElement.Parse(XmlString) : null; }
set {
XmlString = value == null ? null : value.ToString(SaveOptions.DisableFormatting);
}
}
Got the help of these 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/
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class XmlType : Attribute
{
}
In the "OnModelCreating" of the context
modelBuilder.Conventions.Add(new AttributeToColumnAnnotationConvention("XmlType", (p, attributes) => "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";
}
}
}
In the Migration Configuration constructor, register the custom SQL generator.
SetSqlGenerator("System.Data.SqlClient", new CustomSqlGenerator());