Как хранить массив double [] в базе данных с помощью подхода Entity Framework Code-First

Как я могу хранить массив двойников в базе данных, используя Entity Framework Code-First, не влияя на существующий дизайн кода и архитектуры?

Я просмотрел API Data Annotation и Fluent API, я также рассмотрел возможность преобразования двойного массива в строку байтов и сохранение этого байта в базе данных в его собственном столбце.

Я не могу получить доступ к свойству public double[] Data { get; set; } с Fluent API, сообщение об ошибке, которое я получаю, следующее:

Тип double[] должен быть недействительным типом значения, чтобы использовать это как параметр 'T'.

Класс, в котором хранится Data, успешно сохраняется в базе данных и отношения к этому классу. Мне не хватает столбца Data.

Ответ 1

Спасибо всем за ваши материалы, благодаря вашей помощи я смог найти лучший способ решить эту проблему. Что есть:

 public string InternalData { get; set; }
 public double[] Data
 {
    get
    {
        return Array.ConvertAll(InternalData.Split(';'), Double.Parse);                
    }
    set
    {
        _data = value;
        InternalData = String.Join(";", _data.Select(p => p.ToString()).ToArray());
    }
 }

Благодаря этим сообщениям stackoverflow: String to Doubles array и Массив парных чисел в строку

Ответ 2

Вы можете сделать следующее:

    [NotMapped]
    public double[] Data
    {
        get
        {
            string[] tab = this.InternalData.Split(',');
            return new double[] { double.Parse(tab[0]), double.Parse(tab[1]) };
        }
        set
        {
            this.InternalData = string.Format("{0},{1}", value[0], value[1]);
        }
    }

    [EditorBrowsable(EditorBrowsableState.Never)]
    public string InternalData { get; set; }

Ответ 3

Я знаю, что это немного дорого, но вы могли бы сделать это

class Primitive
{
    public int PrimitiveId { get; set; }
    public double Data { get; set; }

    [Required]
    public Reference ReferenceClass { get; set; }
}

// This is the class that requires an array of doubles
class Reference
{
    // Other EF stuff

    // EF-acceptable reference to an 'array' of doubles
    public virtual List<Primitive> Data { get; set; }
}

Теперь это будет отображать единый объект (здесь "Ссылка" ) в "список" вашего примитивного класса. Это в основном позволяет счастливой базе данных SQL и позволяет вам правильно использовать список данных.

Это может не соответствовать вашим потребностям, но это будет способ сделать EF счастливым.

Ответ 4

Было бы намного проще использовать List<double>, а не double[]. У вас уже есть таблица, в которой хранятся ваши значения Data. Вероятно, у вас есть внешний ключ из таблицы в таблицу, где хранятся ваши двойные значения. Создайте еще одну модель, которая отражает таблицу, в которой хранятся парные разряды, и добавление сопоставлений внешних ключей в классе сопоставлений. Таким образом вам не нужно будет добавлять сложную фоковую логику, которая извлекает или сохраняет значения в свойстве класса.

Ответ 5

Натан Уайт имеет лучший ответ (получил мой голос).

Вот небольшое улучшение по сравнению с Джоффри Керном, чтобы разрешить списки любой длины (непроверенные):

    [NotMapped]
    public IEnumerable<double> Data
    {
        get
        {
            var tab = InternalData.Split(',');
            return tab.Select(double.Parse).AsEnumerable();
        }
        set { InternalData = string.Join(",", value); }
    }

    [EditorBrowsable(EditorBrowsableState.Never)]
    public string InternalData { get; set; }