【问题标题】:Entity Framework 4 POCO with Dictionary实体框架 4 POCO 与字典
【发布时间】:2010-05-31 21:42:45
【问题描述】:

我有一个 POCO(普通旧 CLR 对象)

public Foo
{
   public virtual int Id { get; set; }
   public virtual Dictionary<string, string> Stuff { get; set; }
   public virtual string More { get; set; }
}

使用model first 方法(即我还没有数据模型),我将如何处理持久化的东西(字典)?

【问题讨论】:

    标签: dictionary entity-framework-4


    【解决方案1】:

    这不是问题的真实答案,但由于没有其他回复,我将分享我所做的。

    我只是创建了一个新类型{Id, Code, Text} 并将我的字典替换为该类型的列表。然后我做这样的事情来获取键、值或进行查找:

    List<string> texts = (from sv in q.SelectableValues select sv.Text).ToList();
    List<string> codes = (from sv in q.SelectableValues select sv.Code).ToList();
    string text = (from sv in q.SelectableValues where sv.Code == "MyKey" select sv.Text).First();
    

    就我而言,字典中的条目数量往往很少。但是,当字典/列表很大时,请参阅 this question 以了解性能注意事项。

    【讨论】:

      【解决方案2】:

      似乎将字典保存到数据库的通用、正确的方法是枚举的方式,因为表本质上是具有松散顺序概念的集合 - 就像 IEnumerable 一样。也就是说,一个 Dictionary 被枚举为 IEnumerator> ,所以表应该有 2 列:

      Key
      Value
      

      从那里你有复杂类型的现有 EF 约定,其中 Key 实际上可能是具有许多属性和值的对象。例如,用户对象的字典可能如下所示:

      Username (TKey)
      Address1 (TValue)
      Address2 (TValue)
      

      不幸的是,这种通用模式不是 EF 内置的;它应该被提议。

      您可以使用生成 KeyValuePair 的数据注释版本的通用类,而不是为您的解决方案开发特定类型。

      public class EFKeyValuePair<TKey, TValue>
      {
          [Key]
          public TKey Key { get; set; }
          public TValue Value { get; set; }
      }
      

      我不确定您将如何确保表名以合乎逻辑且可验证的方式写出,但无需继承此类并向每个子类添加属性。也许 Fluent API 可以帮助您完成最后一步(我不太熟悉)。

      【讨论】:

        猜你喜欢
        • 2011-06-30
        • 2016-01-28
        • 1970-01-01
        • 2011-04-06
        • 2011-08-24
        • 2011-08-21
        • 2012-03-08
        • 1970-01-01
        • 2012-03-22
        相关资源
        最近更新 更多