Entity Framework Code First List <string>Отображение свойств - PullRequest
22 голосов
/ 30 ноября 2011

Сначала я работаю с 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 я мог бы написать пользовательский связыватель модели, чтобы обработать преобразование очень безопасным и многократно используемым способом.

Есть ли ЛЮБОЙ способ сделать это для Entity Framework, который так же чист, как пользовательские связыватели моделей для MVC?

Ответы [ 2 ]

25 голосов
/ 30 ноября 2011

Нет, 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; }
}
6 голосов
/ 20 октября 2014

Третьим вариантом было бы выполнить сериализацию с использованием JSON.NET.

Я провел несколько тестов производительности для сценариев записи, используя 3 параметра, перечисленные в этом потоке (String split serialization, JSON.NET и введениесущность) и обнаружил, что JSON.NET дает лучшую производительность.

Предварительные результаты записи 200 равных сущностей ( посмотрите исходный код здесь и выполните тест самостоятельно ):

  • Время написания сущностей с использованием сериализатора строк: 896 миллисекунд
  • Время записи сущностей с использованием сериализатора json: 516 миллисекунд
  • Время записи сущностей с использованием нескольких сущностей: 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);                    
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...