webentwicklung-frage-antwort-db.com.de

Speichern von Double [] - Arrays in einer Datenbank mit dem Code-First-Ansatz von Entity Framework

Wie kann ich mit Entity Framework Code-First ein Array von Doubles in der Datenbank speichern, ohne dass dies Auswirkungen auf den vorhandenen Code und das Architekturdesign hat?

Ich habe mir Data Annotation und Fluent API angesehen. Außerdem habe ich mir überlegt, das Double-Array in eine Bytefolge zu konvertieren und dieses Byte in der Datenbank in seiner eigenen Spalte zu speichern.

Ich kann nicht mit der Fluent-API auf die public double[] Data { get; set; }-Eigenschaft zugreifen. Die Fehlermeldung, die ich dann bekomme, lautet:

Der Typ double[] muss ein nicht-nullwertfähiger Werttyp sein, um Als Parameter 'T' verwenden zu können.

Die Klasse, in der Data gespeichert ist, wird erfolgreich in der Datenbank gespeichert und die Beziehungen zu dieser Klasse. Mir fehlt nur die Spalte Data

20
jonas

Vielen Dank für Ihre Beiträge. Dank Ihrer Hilfe konnte ich den besten Weg finden, um dieses Problem zu lösen. Welches ist:

 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());
    }
 }

Dank dieser stackoverflow-Posts: String zu Doubles array und Array von Doubles zu einem String

23
jonas

Sie können so etwas tun:

    [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; }
40
Joffrey Kern

Ich weiß, es ist ein bisschen teuer, aber Sie könnten das tun

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

Dadurch wird eine einzelne Entität (hier 'Referenz') einer 'Liste' Ihrer Primitiv-Klasse zugeordnet. Dies dient im Wesentlichen dazu, dass die SQL-Datenbank zufrieden ist und Sie Ihre Datenliste entsprechend verwenden können.

Dies entspricht möglicherweise nicht Ihren Bedürfnissen, ist aber eine Möglichkeit, EF glücklich zu machen.

5
Nathan White

Es wäre viel einfacher, wenn Sie statt List<double>double[] verwenden. Sie haben bereits eine Tabelle, in der Ihre Data-Werte gespeichert werden. Sie haben wahrscheinlich einen Fremdschlüssel aus einer Tabelle in die Tabelle, in der Ihre Doppelwerte gespeichert sind. Erstellen Sie ein anderes Modell, das die Tabelle widerspiegelt, in der Doubles gespeichert sind, und fügen Sie der Zuordnungsklasse Fremdschlüsselzuordnungen hinzu. Auf diese Weise müssen Sie keine komplexe Hintergrundlogik hinzufügen, die Werte in einer Klasseneigenschaft abruft oder speichert.

4
Husein Roncevic

Verwenden Sie nicht doppelt [] use List insted.

So was.

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

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

All diese Lösung, die ich dort sehe, ist schlecht, weil:

  1. Wenn Sie eine Tabelle erstellen, möchten Sie keine Daten wie diese speichern: "99.5,89.65,78.5,15.5" ist ungültig! Erstens ist es eine Zeichenfolge, die bedeutet, dass Sie einen Buchstaben eingeben können, und in dem Moment, in dem Ihr ASP.NET-Server double.Parse aufruft. Pararse führt zu FormatException, die Sie wirklich nicht wollen!

  2. Es ist langsamer, da der Server die Zeichenfolge analysieren muss. Warum muss die Zeichenfolge analysiert werden, stattdessen werden fast Daten von SQL Server bereitgestellt, die verwendet werden sollen.

1
Pavel B.

Nathan White hat die beste Antwort (bekam meine Stimme).

Hier ist eine kleine Verbesserung gegenüber der Antwort von Joffrey Kern, um Listen beliebiger Länge zu ermöglichen (ungetestet):

    [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; }
1
Jacob Brewer