Подтвердить что ты не робот

Первый код структуры 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?

4b9b3361

Ответ 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);                    
        }
    }
}