12

我想使用SQL Server xml类型作为实体类的列类型。EF 4.1中的XML数据类型代码优先

根据this thread有可能这样一个列映射到类型:

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

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

该表是在由此定义的DATEBASE正确生成。新的XmlEntity对象也可以创建。

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

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

错误:模型生成过程中检测到

一个或多个验证错误 System.Data .Edm.EdmEntityType:EntityType'XElement'没有定义键。定义此EntityType的关键字。

回答

18

的问题是与我的包装特性:

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

我没有指定NotMapped属性。

+1

感谢分享! –

+0

@alexey,伟大的问题和答案,但是如果您将XElement属性包含在其中 - 根据MSDN文章,这个问题会更有意义吗?目前没有XElement属性。所以目前还不清楚唯一的变化是[NotMapped]属性。 –

7

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

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

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

这是你怎么做,在数据注释,如果你想用流利的API(并使用映射类),则:

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

     this.Ignore(c => c.XmlValueWrapper); 
    } 
} 

如果你通过的DbContext覆盖OnModelCreating然后用流利的API只需用modelBuilder改变这个“this”即可。实体<XmlEntity>()