2012-12-12 76 views
0

我不知道是否有在EF代碼優先的方式來指定如何存儲標屬性本例:EF代碼首先指定如何存儲標量屬性

我有這樣的POCO對象:

public class MyObject 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public ICollection<Url> Urls { get; set; } 
} 

有沒有一種方法可以告訴EF將url作爲byte []使用protobuff與地圖或其他機制進行存儲?

回答

0

否,除非您在MyObject類中直接創建第二個byte[]屬性。比你會映射一個新的屬性,並忽略舊的屬性。如果將轉換邏輯直接包含到類中(以獲取Url屬性的getter和setter),或者如果使用覆蓋SaveChanges和處理程序ObjectContext.ObjectMaterialized在數據訪問基礎結構的範圍內進行轉換,則一旦擁有此映射,則由您決定。

如果您選擇,您將無法通過網址查詢。 EF的唯一可見屬性將是新的字節數組。

+0

我正在使用兩個屬性的技巧,我不喜歡它,但現在我會繼續它!謝謝 – Swell

0

不,我不認爲有可能直接指示EF將項目集合存儲爲byte [],但您可以使用一些小的解決方法。

添加NotMapped屬性的Urls屬性 - 它從EF模型不包括的屬性,那麼添加另一個屬性SerializedUrls將包含您的收藏序列化爲字節[],它會被保存到數據庫中。最後通過getter/setter同步UrlsSerializedUrls特性。

private byte[] _serializedUrls; 
private ICollection<Url> _urls; 

public byte[] SerializedUrls { 
    get { return _serializedUrls; } 
    set { 
    _urls = this.Deserialize(value); 
    _serializedUrls = value; 
    } 
} 

[NotMapped] 
public ICollection<Url> Urls { 
    get { return _urls; } 
    set { 
    _urls = value; 
    _serializedUrls = this.Serialize(value);   
    } 
} 

private byte[] Serialize(ICollection<Url> collection) { 
    //call protobuf to serialize data 
} 

private ICollection<Url> Deserialize(byte[] data) { 
    //call protobuf to deserialize data 
} 

public void UpdateSerializedValue() { 
    serializedUrls = this.Serialize(_urls); 
} 

注:因爲收藏的二進制表示的變化,當你在集合中添加/刪除/修改項目,請確保您更新SerializedUrls如果收集的內容改變。