2012-01-23 49 views
6

我想先使用EF代碼來處理當前使用普通舊ADO.NET和存儲過程訪問的數據庫。EF代碼優先 - 地圖詞典或自定義類型作爲nvarchar

在我的數據庫中,我有一些nvarchar(MAX)列,應該映射到Dictionary<string, string>或從Dictionary<string, string>映射。

保存到數據庫時,它是一個XML格式的字符串。我使用這種技術來實現例如國際化。網上商店中產品的名稱。我不知道任何給定用戶想翻譯多少種語言,所以我不能爲每種語言設置Name列。

我也想避免將值存儲在單獨的表中,所以我最終選擇了Dictionary - XML方法。

我現在這樣做的方式是,只要將任何這些列視爲字符串,只要我與數據庫交互。我有一個自定義映射器函數,可以將XML轉換爲字典,並返回到XML。

但我似乎無法找到一種方法,首先與EF代碼做到這一點?有任何想法嗎?

回答

12

您可以添加一個屬性,將您的Dictionary<,>作爲XML字符串返回,然後刪除Dictionary<,>屬性的映射。

[NotMapped] 
    public Dictionary<string,string> MyDictionary 
    { 
    get; set; 
    } 

    public string DictionaryAsXml 
    { 
     get 
     { 
      return ToXml(MyDictionary); 
     } 
     set 
     { 
      MyDictionary = FromXml(value); 
     } 
    } 

如果你不想揭穿你DictionaryAsXml財產看看this blog post。它顯示了你如何堅持私人和受保護的財產。

+0

太棒了!謝謝:) - 我不會想這樣做 – Yablargo

+0

爲什麼XML而不是JSON,最後一個更緊湊,並且在數據庫存儲方面更高效? – Piou

+1

@Piou我不記得五年前我到底在想些什麼,但我想我還是習慣於將XML再用於JSON。我確實假設這個例子也適用於JSON,所以請隨時嘗試。但請記住,過早優化是所有邪惡的根源。 –

2

我在VB.NET中進行xml轉換時遇到了一些困難。因此,我利用newtonsoft.json將字典序列化爲JSON字符串並返回。

Public Property JsonDict As String 
    Get 
     If MyDict Is Nothing Then 
      Return Nothing 
     Else 
      Return JsonConvert.SerializeObject(MyDict) 
     End If 
    End Get 
    Set(value As String) 
     If value Is Nothing Then 
      MyDict = Nothing 
     Else 
      MyDict = JsonConvert.DeserializeObject(Of Dictionary(Of Single, Single))(value) 
     End If 
    End Set 
End Property 
<NotMapped> 
Public Property MyDict As Dictionary(Of Single, Single)