我通过属性实现了所需的功能,并用该属性装饰了我的模型类 xml 字段。
[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);
}
}
得到了这2篇文章的帮助:
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
{
}
在上下文中注册属性
在“OnModelCreating”的上下文中
modelBuilder.Conventions.Add(new AttributeToColumnAnnotationConvention<XmlType, string>("XmlType", (p, attributes) => "xml"));
自定义 Sql 生成器
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";
}
}
}
注册自定义 Sql 生成器
在迁移配置构造函数中,注册自定义 SQL 生成器。
SetSqlGenerator("System.Data.SqlClient", new CustomSqlGenerator());