【问题标题】: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 可以帮助您完成最后一步(我不太熟悉)。