EF Code First - 将字典或自定义类型映射为nvarchar

时间:2012-01-23 14:17:05

标签: entity-framework ef-code-first

我想首先将EF代码用于我正在使用带有存储过程的普通旧ADO.NET访问的数据库。

在我的数据库中,我有一些nvarchar(MAX)列应该与Dictionary<string, string>进行映射。

保存到数据库时,它是XML格式的字符串。我使用这种技术来实现例如国际化。在线商店中的产品名称。我不知道任何给定用户想要翻译的语言数量,因此我不能为每种语言添加Name列。

我还想避免将值存储在一个单独的表中,所以我最终得到了Dictionary - XML方法。

我现在的做法是,每当我与数据库交互时,只将这些列中的任何一个视为字符串。我有一个自定义映射器函数,可以将XML转换为字典,然后再转换为XML。

但我似乎无法首先找到使用EF Code执行此操作的方法?有什么想法吗?

2 个答案:

答案 0 :(得分:13)

您可以添加一个属性,将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。它显示了如何持久保存私有和受保护的属性。

答案 1 :(得分:3)

我在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)