【问题标题】:XML data type in EF 4.1 Code FirstEF 4.1 Code First 中的 XML 数据类型
【发布时间】:2011-11-03 16:13:40
【问题描述】:

我想使用 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 的键。

【问题讨论】:

    标签: entity-framework entity-framework-4 ef-code-first ef4-code-only xml-column


    【解决方案1】:

    如果您想使用 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() 更改那些“this”

    【讨论】:

      【解决方案2】:

      只是为了完整。这是所需的所有代码,在一个部分中。

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

      【讨论】:

        【解决方案3】:

        问题出在我的包装器属性上:

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

        我没有指定 NotMapped 属性。

        【讨论】:

        • @alexey ,很好的问答,但是如果您在其中包含 XElement 属性,这个问题会不会更有意义——根据 MSDN 文章?目前没有 XElement 属性。所以不清楚唯一的变化是 [NotMapped] 属性。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多