EF 4.1 Code First中的XML数据类型

时间:2011-08-25 12:52:29

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

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

根据this thread,可以将此列映射到字符串类型:

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 个答案:

答案 0 :(得分:18)

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

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

我没有指定 NotMapped 属性。

答案 1 :(得分:7)

要完成。这是所有需要的代码,一部分。

[Column(TypeName = "xml")]
public String XmlContent { get; set; }

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

答案 2 :(得分:3)

如果您想使用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&lt; XmlEntity&gt;()

更改那些“this”