首页 文章

EF 4.1 Code First中的XML数据类型

提问于
浏览
12

我想使用SQL Server xml 类型作为实体类的列类型 .

根据this thread,可以将这样的列映射到 string 类型:

public class XmlEntity
{
   public int Id { get; set; }

   [Column(TypeName="xml")]
   public string XmlValue { get; set; }
}

该定义在数据库中正确生成了该表 . 也可以创建新的 XmlEntity 对象 .

但后来我尝试从数据库中获取一些实体:

var entity = db.XmlEntities.Where(e => e.Id == 1).FirstOrDefault();

发生错误:

在模型生成期间检测到一个或多个验证错误System.Data.Edm.EdmEntityType:EntityType'XElement'没有定义键 . 定义此EntityType的键 .

3 回答

  • 3

    问题在于我的包装器属性:

    [NotMapped]
    public XElement XmlValueWrapper
    {
        get { return XElement.Parse(XmlValue); }
        set { XmlValue = value.ToString(); }
    }
    

    我没有指定 NotMapped 属性 .

  • 7

    只是为了完整 . 这是一部分所需的所有代码 .

    [Column(TypeName = "xml")]
    public String XmlContent { get; set; }
    
    [NotMapped]
    public XElement InitializedXmlContent
    {
        get { return XElement.Parse(XmlContent); }
        set { XmlContent = value.ToString(); }
    }
    
  • 18

    如果您想使用Fluent API(并使用映射类),那么您就可以在Data Annotations中执行此操作了:

    public partial class XmlEntityMap : EntityTypeConfiguration<XmlEntity>
    {
        public FilterMap()
        {
            // ...
            this.Property(c => c.XmlContent).HasColumnType("xml");
    
            this.Ignore(c => c.XmlValueWrapper);
        }
    }
    

    如果您通过覆盖DbContext上的OnModelCreating来使用Fluent API,那么只需使用modelBuilder.Entity <XmlEntity>()更改那些“this”

相关问题