Первый код структуры Entity Framework <строкa> Сопоставление свойств
Сначала я работаю с Entity Framework Code. У меня простая модель:
public class Variable
{
public string Name { get; set; }
public int Id { get; set; }
public IList<string> TextOptions
{
get;
set;
}
}
Я столкнулся с проблемами, когда свойство TextOptions
имеет тип List<String>
.
Когда я пытаюсь сделать это в Entity Framework, он не отображается.
Я нашел решение здесь (stackoverflow), которое исправляет мою проблему. Я в основном переделываю свой класс, чтобы он взял список и сделал его разделительной строкой, которая вместо этого сохраняется:
public class Variable : IVariable
{
public string Name { get; set; }
public int Id { get; set; }
public virtual IList<string> TextOptions
{
get
{
return _TextOptions;
}
set
{
_TextOptions = value;
}
}
private IList<string> _TextOptions;
public string TextOptionsSerialized
{
get
{
return String.Join(";", _TextOptions);
}
set
{
_TextOptions = value.Split(new char[]{';'}, StringSplitOptions.RemoveEmptyEntries).ToList();
}
}
}
Этот код работает нормально. Проблема, с которой я сталкиваюсь, заключается в том, что я считаю, что это нарушает Разделение Концерна. Я не думаю, что мой модельный класс должен быть связан с сериализацией списка строк, чтобы инфраструктура Entity могла его сохранить.
У меня возникла аналогичная проблема, работающая в ASP.Net MVC. У меня была почта, отправленная с клиентом, которая будет сопоставлена с моделью. Были некоторые проблемы с тем, как модель была структурирована по сравнению с постами. В MVC я мог написать Custom Binder для обработки конверсии очень безопасным и многоразовым способом.
Есть ли какой-либо способ сделать это для Entity Framework, который так же чист, как Custom Mind для MVC?
Ответы
Ответ 1
Нет, EF не имеет каких-либо преобразователей типов или настраиваемых типов в качестве альтернативы связующим машинам MVC. Вы всегда должны использовать хак, чтобы настойчивость. Другой способ сделать то же самое - сопоставить TextOptions
как совокупность связанных объектов. Это сделает ваше разделение проблем лучше, но это усложнит вашу модель и будет работать с Variable
.
public class Variable
{
public string Name { get; set; }
public int Id { get; set; }
public IList<TextOption> TextOptions
{
get;
set;
}
}
public class TextOption
{
public int Id { get; set; }
public string Text { get; set; }
}
Ответ 2
Третьим вариантом будет выполнение сериализации с использованием JSON.NET.
Я выполнил некоторые тесты производительности для сценариев записи, используя 3 варианта, перечисленные в этом потоке (сериализация строк, JSON.NET и введение сущности), и обнаружил, что JSON.NET дает лучшую производительность.
Предварительные результаты записи 200 равных объектов (см. исходный код здесь и выполните тест самостоятельно):
- Время записи объектов с использованием строкового сериализатора: 896 miliseconds
- Время записи объектов с использованием json serializer: 516 miliseconds
- Время записи объектов с использованием нескольких объектов: 706 миллисекунд
Пример с использованием сериализатора JSON:
public class VariableJson
{
public string Name { get; set; }
public int Id { get; set; }
public virtual IList<string> TextOptions
{
get
{
return _TextOptions;
}
set
{
_TextOptions = value;
}
}
private IList<string> _TextOptions;
public string TextOptionsSerialized
{
get
{
return JsonConvert.SerializeObject(_TextOptions);
}
set
{
_TextOptions = JsonConvert.DeserializeObject<IList<string>>(value);
}
}
}