2011-02-28 59 views
9

我在Model-First模式中使用實體框架4.0(CT​​P5)構建ORM。我的一些實體具有複雜的(對象樹)屬性,不需要是ORM實體 - 它們只對使用此數據庫的後端服務器系統感興趣,而不是使用此數據庫的客戶端。如何在實體框架4.0模型中指定SQL Server XML數據類型?

我可以將屬性的對象樹序列化爲一個字符串並將其作爲字符串存儲在數據庫中,但SQL Server XML數據類型確實很吸引人。爲了能夠以智能的方式查詢XML數據內容將是非常好的。

但是,我沒有看到任何方式指定我想在Visual Studio實體建模器中的XML數據類型。

是否只有這樣做才能在模型中指定字符串字段,發出DDL,然後修改DDL以將字符串字段更改爲XML字段?這看起來非常脆弱,只寫一次,從不改變。有沒有更好的辦法?

+2

順便說一句,它不再是「SQL XML」。它只是SQL Server的一個內置部分。 – 2011-03-01 00:31:48

+0

它在短期內無法幫助您,但您可以對此進行投票:http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1051783-xml-data-type -support – 2013-12-09 11:39:12

回答

8

在「實體框架4.0食譜」中,Larry Tenny和Zeeshan Hirani聲明EF 4.0完全不支持XML數據類型。

它們提供了一種解決方法,即將模型生成的實體類的字符串類型屬性設置爲private,並創建一個新屬性(在您自己的實體類的部分類中)從內部返回XElement字符串屬性:

public partial class Candidate 
{ 
    private XElement candidateResume = null; 

    public XElement CandidateResume 
    { 
     get 
     { 
      if (candidateResume == null) 
      { 
       candidateResume = XElement.Parse(this.Resume); 
       candidateResume.Changed += (s,e) => 
       { 
        this.Resume = candidateResume.ToString(); 
       } 
      } 

      return candidateResume; 
     } 

     set 
     { 
      candidateResume = value; 
      candidateResume.Changed += (s,e) => 
      { 
       this.Resume = candidateResume.ToString(); 
      } 
      this.Resume = value.ToString(); 
     } 
    } 
} 

創建像這應該工作所需的XML類型的陰影性質,但對原字符串屬性(簡歷)和新的陰影性質的每一個變化串和XML之間的轉換(CandidateResume)非常昂貴。

如果有人有任何更好的想法,我仍然樂於接受建議。

0

我發現了一種方法來掩蓋Entity Framework通過使用隱藏的複雜類型將XML屬性映射到String屬性的事實。儘管這需要您在將每個受影響的實體保存到數據庫中之前修改它們。粗略地說,我利用了Entity Framework允許您在.csdl文件中指定內部類型的事實。

我已經介紹了我的辦法,詳細一點的位置:.net ORM Comparison

我也剛安裝的CTP5來看看代碼,第一種方法,看看是否可以用同樣的方法,而不必一.edmx或.csdl文件。如果我找到另一種方法,我會編輯這個答案。

+0

聽起來很有希望! – dthorpe 2011-03-02 23:38:27

+0

我在第一次嘗試時沒有運氣。簡單,因爲我無法弄清楚如何直接使用複雜類型。如果你能告訴我你到目前爲止還有什麼代碼優先的方法(我對DbContext,DbSet等感到困惑),我可能會「掛鉤」它。 – 2011-03-02 23:55:31

相關問題