Как сохранить двойной массив[] в базу данных с помощью кода 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; }
}
все это решение, которое я вижу, плохо, потому что:
Если вы создаете таблицу, вы не хотите хранить данные, как это: "99.5,89.65,78.5,15.5" это не действует! Во-первых, это строка, которая означает, что вы можете ввести в нее письмо и в тот момент, когда ваш ASP.NET двойной вызов сервера.Разбор это приведет к FormatException и что вы действительно не хочу!
Это медленнее, потому что ваш сервер должен разобрать строку. Зачем анализировать строку вместо того, чтобы получать почти готовые данные из SQL Server для использования?