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>()