12

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

根据这个线程,可以将这样的列映射到字符串类型:

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 的键。

4

3 回答 3

18

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

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

我没有指定NotMapped属性。

于 2011-08-25T13:05:34.917 回答
8

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

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

[NotMapped]
public XElement InitializedXmlContent
{
    get { return XElement.Parse(XmlContent); }
    set { XmlContent = value.ToString(); }
}
于 2012-05-11T13:37:36.297 回答
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<XmlEntity>() 更改那些“this”

于 2012-05-12T16:22:41.130 回答