zmb*_*mbq 16 c# xml ef-code-first ef-migrations
我正在尝试在Code First中创建XML列.我很清楚Entity Framework不完全支持XML列,并且它将它们作为字符串读取.没关系.不过,我仍然希望列类型为XML.这是我的班级:
class Content
{
public int ContentId { get; set; }
[Column(TypeName="xml")]
public string XmlString { get; set; }
[NotMapped]
public XElement Xml { get { ... } set { ... } }
}
Run Code Online (Sandbox Code Playgroud)
问题是,Code First Migrations完全忽略Column属性并将字段创建为nvarchar(max).我试过用[DataType("xml")],但那也没用.
这是迁移错误吗?
TDa*_*ver 32
你有没有尝试过:
public String XmlContent { get; set; }
public XElement XmlValueWrapper
{
get { return XElement.Parse(XmlContent); }
set { XmlContent = value.ToString(); }
}
public partial class XmlEntityMap : EntityTypeConfiguration<XmlEntity>
{
public XmlEntityMap()
{
// ...
this.Property(c => c.XmlContent).HasColumnType("xml");
this.Ignore(c => c.XmlValueWrapper);
}
}
Run Code Online (Sandbox Code Playgroud)
我使用属性实现了所需的功能,并使用该属性装饰了我的模型类 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);
}
}
Run Code Online (Sandbox Code Playgroud)
得到了这两篇文章的帮助:
https://entityframework.codeplex.com/wikipage?title=Code%20First%20Annotations
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class XmlType : Attribute
{
}
Run Code Online (Sandbox Code Playgroud)
在上下文的“OnModelCreating”中
modelBuilder.Conventions.Add(new AttributeToColumnAnnotationConvention<XmlType, string>("XmlType", (p, attributes) => "xml"));
Run Code Online (Sandbox Code Playgroud)
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";
}
}
}
Run Code Online (Sandbox Code Playgroud)
在迁移配置构造函数中,注册自定义 SQL 生成器。
SetSqlGenerator("System.Data.SqlClient", new CustomSqlGenerator());
Run Code Online (Sandbox Code Playgroud)
现在可以在 Entity Framework Core 2.1+ 中使用 SQL Server XML 列类型和值转换来实现这一点,而无需额外的属性。
public class Content
{
public int ContentId { get; set; }
public XElement Xml { get; set; }
}
internal class ContentEntityTypeConfiguration : IEntityTypeConfiguration<Content>
{
public void Configure(EntityTypeBuilder<Content> builder)
{
builder.HasKey(e => e.ContentId);
builder.Property(e => e.ContentId)
.ValueGeneratedOnAdd();
builder.Property(e => e.Xml)
.HasConversion(
xml => xml.ToString(),
xml => xml != null ? XElement.Parse(xml) : null)
.HasColumnType("xml");
}
}
public class MyDbContext : DbContext
{
public DbSet<Content> Contents { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfiguration(new ContentEntityTypeConfiguration());
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15251 次 |
| 最近记录: |