【问题标题】:EF Code First - Map Dictionary or custom type as an nvarcharEF Code First - 将字典或自定义类型映射为 nvarchar
【发布时间】:2012-01-23 14:17:05
【问题描述】:

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

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

当保存到数据库时,它是一个 XML 格式的字符串。我使用这种技术来允许例如国际化。在线商店中产品的名称。我不知道任何给定用户想要翻译多少种语言,所以我不能为每种语言设置Name 列。

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

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

但我似乎无法先找到使用 EF 代码的方法?有什么想法吗?

【问题讨论】:

    标签: entity-framework ef-code-first


    【解决方案1】:

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

    【讨论】:

    • 太棒了!谢谢 :) -- 我没想到会这样做
    • 为什么是 XML 而不是 JSON,后者更紧凑,在 DB 存储方面更高效?
    • @Piou 我不记得五年前我到底在想什么,但我想我还是更习惯 XML,而不是 JSON。我确实假设该示例也适用于 JSON,因此请随意尝试。但是请记住,过早的优化是万恶之源。
    • 因为 SQL Server 可以查询 XML —— 它并不快,但它是内置的。 -- docs.microsoft.com/en-us/sql/t-sql/xml/…
    • 另外,将这些属性设置为 [StringLength(int.MaxValue)] 可能会有所帮助,这样您就不会遇到列大小问题。
    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-30
      • 2011-07-03
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多