2012-01-23 15 views
6

私は現在、ストアドプロシージャを持つ古いADO.NETを使用して現在アクセスしているデータベースに対してEFコードを使用したいと考えています。EFコードファーストマップnvarcharとしての辞書型またはカスタム型

私のデータベースには、Dictionary<string, string>にマップする必要があるnvarchar(MAX)の列があります。

データベースに保存すると、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

なぜJSONではなく、XMLは最後のほうがコンパクトで、DBストレージの期間で効率的だろうか? – Piou

+1

@ピオー私は5年前に思っていたことを正確に覚えていませんが、私はまだJSONのXMLにもっと慣れていたと思います。私はこの例も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) 
関連する問題