Entity Framework 4 POCO со словарем - PullRequest
13 голосов
/ 01 июня 2010

У меня есть POCO (Простой старый объект CLR)

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

Используя модель сначала (т. Е. У меня еще нет модели данных), как бы я справился с сохранением Stuff (Dictionary)?

Ответы [ 2 ]

8 голосов
/ 12 июня 2010

Это не верный ответ на вопрос, но поскольку других ответов нет, я поделюсь тем, что сделал.

Я просто создал новый тип {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();

В моем случае количество записей в словаре обычно невелико. Тем не менее, см. этот вопрос , чтобы узнать о производительности, когда словарь / список велик.

7 голосов
/ 18 октября 2011

Похоже, обобщенный, правильный способ сохранения словаря в базе данных будет таким же, каким он перечисляется, поскольку таблицы по сути являются множествами со свободным понятием порядка - как IEnumerable То есть словарь перечисляется как 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 поможет вам сделать этот последний шаг (с которым я не очень хорошо знаком).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...