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

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

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

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

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

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

6 ответов


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

    [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; }

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

 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: строка для удвоения массива и массив двойников в строку


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

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 счастливым.


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


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

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

    [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; }

Не используйте double[] использовать список insted.

такой.

public class MyModel{
    ...
    public List<MyClass> Data { get; set; }
    ...
}

public class MyClass{
    public int Id { get; set; }
    public double Value { get; set; }
}

все это решение, которое я вижу, плохо, потому что:

  1. Если вы создаете таблицу, вы не хотите хранить данные, как это: "99.5,89.65,78.5,15.5" это не действует! Во-первых, это строка, которая означает, что вы можете ввести в нее письмо и в тот момент, когда ваш ASP.NET двойной вызов сервера.Разбор это приведет к FormatException и что вы действительно не хочу!

  2. Это медленнее, потому что ваш сервер должен разобрать строку. Зачем анализировать строку вместо того, чтобы получать почти готовые данные из SQL Server для использования?