2013-07-25 43 views
4

我使用實體框架與Code First模型(pet項目,我喜歡編輯簡單的類並讓我的模式自動更新)。我有一個類如下:實體框架代碼優先的XML字段

[Table("Polygons")] 
public class Polygon 
{ 
    public int PolygonId { get; set; } 
    public String Texture { get; set; } 

    public virtual ICollection<Point> Points { get; set; } 
} 

[Table("Points")] 
public class Point 
{ 
    public int PolygonId { get; set; } 
    public double X { get; set; } 
    public double Y { get; set; } 
} 

我在數據庫中存儲多邊形,並能夠查詢他們的紋理是有用的。另一方面,如果我用5,000點保存一個多邊形到數據庫,它將永遠需要運行這麼多插入,並且說實話,除了檢索一個單獨的多邊形,我絕不會查詢點。

我很樂意做「點」類擺脫「PolygonId」的,擺脫了「點」表,並有多邊形查表像

PolygonId int PK 
Texture varchar(255) 
Points XML 

而且然後讓這些點序列化爲直接保存到表中的字符串,然後將其反序列化爲一個點數組。有沒有辦法讓EF做到這一點,或者爲該領域編寫自定義序列化器/反序列化器,所以至少在整個代碼庫中使用它似乎是自動的?

感謝,

回答

6

我認爲你必須添加另一個屬性和編寫一些代碼做序列化。

這應做到:

[Table("Polygons")] 
public class Polygon 
{ 
    public int PolygonId { get; set; } 
    public String Texture { get; set; } 

    [NotMapped] 
    public virtual ICollection<Point> Points { get; set; } 

    [Column("Points")] 
    [EditorBrowsable(EditorBrowsableState.Never)] 
    [DebuggerBrowsable(DebuggerBrowsableState.Never)] 
    public string PointsXml 
    { 
     get 
     { 
      var serializer = new XmlSerializer(typeof (List<Point>)); 
      using (var stringWriter = new StringWriter()) 
      { 
       serializer.Serialize(stringWriter, Points.ToList()); 
       stringWriter.Flush(); 
       return stringWriter.ToString(); 
      } 
     } 
     set 
     { 
      var serializer = new XmlSerializer(typeof(List<Point>)); 
      using (var stringReader = new StringReader(value)) 
      { 
       Points = (List<Point>) serializer.Deserialize(stringReader); 
      } 
     } 
    } 
} 

EditorBrowsableDebuggerBrowsable屬性是可選的,將只保留XML屬性不再出現在智能感知(當此類型從庫中使用)和調試了。