2012-07-02 67 views
8

我有Code First類/表,其中一個字段的類型爲string/nvarchar。這個字符串是MyClass實例的JSON表示。我想只用MyClass實例的代碼進行操作,但將其作爲字符串(JSON)存儲在數據庫中。比方說,我的表看起來像這樣:實體框架:在場景後面序列化/反序列化JSON列

public class Message 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string JsonDefinition { get; set; } 
} 

我寧願把它像這樣

public class Message 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Title { get; set; } 
    [JSON] 
    public MyClass JsonDefinition { get; set; } 
} 

凡JSON是一個自定義屬性,它告訴EF存儲領域MyClass的實例爲序列化的字符串。並在同一時間它說EF:「一旦你拉實體,取代JsonDefinition字符串與反序列化的MyClass實例」

是否有可能實現現有的EF 4機制?如果是這樣,那麼怎麼樣?

在此先感謝。

編輯:MyClass可以是字典或任何其他複雜類型。

+0

這可能有助於:http://www.reddnet.net/entity-framework-json-column/ –

回答

8

不直接。您必須始終將您的字符串屬性存在於您的班級中,因爲EF要求它具有持久性。您也可以擁有未映射的MyClass屬性,但必須手動處理序列化和反序列化,並使這些屬性同步。

樸素的解決方案是在您的MyClass中實現INotifyPropertyChanged,並確保MyClass值或其任何屬性中的每個更改都會觸發JSON序列化爲字符串屬性。這個天真的解決方案適用於一些簡單的問題,但在這種情況下,它是一個非常糟糕的主意,因爲如果您修改了分配的MyClass屬性中的很多屬性,它可能會產生巨大的性能影響。

另一種方法是使用EF的掛鉤實現並保存更改。您將需要處理ObjectContext.ObjectMaterialized事件(您可以從DbContext獲得ObjectContext通過IObjectContextAdapter明確實施,由DbContext)。在此事件處理程序中,您將使用字符串屬性的值並將其內容反序列化爲MyClass屬性。您還需要覆蓋DbContext.SaveChanges,您將在其中查找應該插入或更新的所有Message實例,並使用MyClass屬性獲取當前值並將其序列化爲字符串屬性。

您正在尋找的是一些複雜的映射場景或映射轉換。英孚不支持他們,但你可以投我的建議Data UserVoice

+0

而不是使用實體的鉤子,你可以讓屬性getter按需進行序列化,並且setter執行反序列化並填充對象的其餘部分? –

+0

@KevinKibler這與INotifyPropertyChanged解決方案具有相同的問題,但它會起作用。 – Casey