2013-03-05 9 views
17

Come posso archiviare una serie di duplicati nel database utilizzando Entity Framework Code-First senza alcun impatto sul codice esistente e sulla progettazione dell'architettura?Come archiviare il doppio [] array nel database con il codice Entity Framework Primo approccio

Ho esaminato Data Annotation e Fluent API, ho anche preso in considerazione la conversione del doppio array in una stringa di byte e l'archiviazione del byte nel database nella propria colonna.

Non riesco ad accedere alla proprietà public double[] Data { get; set; } con API Fluent, il messaggio di errore Allora ottengo è:

Il tipo double[] deve essere un tipo di valore non annullabile al fine di utilizzare come parametro 'T' .

La classe in cui è memorizzato Data è stata memorizzata correttamente nel database e le relazioni con questa classe. Mi manca solo la colonna Data.

+0

Cosa significa i dati rappresentano? Forse c'è un modo per modificare il codice per far funzionare tutto senza modificare troppo l'architettura. –

+0

Oppure, per una semplice correzione, non si può creare una stringa separata da virgola con tutti i valori double quando si scrive nel database, quindi analizzare la stringa quando sono necessari i valori? –

+0

@NathanWhite è un qualcosa che stiamo prendendo in considerazione. Ma vorremmo qualcosa di più automatico da EF.Considerando le risposte a questo mi dice che non c'è modo di dire automaticamente una matrice di doppi al database con EF. Corretta? – jonas

risposta

16

Grazie a tutti per i vostri input, grazie al vostro aiuto sono stato in grado di individuare il modo migliore per risolvere questo problema. Quale è:

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

Grazie a questi posti StackOverflow: String to Doubles array e Array of Doubles to a String

+1

Nel caso qualcuno si stia chiedendo, 'InternalData' deve essere pubblico o non farà parte dello schema del database. Potrebbe anche essere una buona idea aggiungere '[NotMapped]' all'attributo 'Data', anche se non è necessario. Ciò rende chiaro che l'attributo non fa parte dello schema del database. –

36

Si può fare una cosa del genere:

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

lo so che è un po 'costoso, ma si potrebbe fare questo

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

Questo sarà ora mappare una singola entità (qui 'di riferimento ') a un' elenco 'della tua classe Primitive. Questo è fondamentalmente per consentire al database SQL di essere felice e consentire all'utente di utilizzare l'elenco di dati in modo appropriato.

Questo potrebbe non essere adatto alle vostre esigenze, ma sarà un modo per rendere felice EF.

4

Sarebbe molto più semplice se si utilizza List<double> anziché double[]. Hai già una tabella che memorizza i tuoi valori Data. Probabilmente hai una chiave esterna da una tabella alla tabella in cui sono memorizzati i tuoi valori double. Creare un altro modello che rifletta la tabella in cui sono memorizzati i doppi e aggiungere i mapping di chiavi esterne nella classe di mapping. In questo modo non avrai bisogno di aggiungere qualche logica di background complessa che recuperi o memorizzi i valori in una proprietà di classe.

1

Nathan White ha la migliore risposta (ottenuto il mio voto).

Ecco un piccolo miglioramento rispetto la risposta di Joffrey Kern per consentire gli elenchi di qualsiasi lunghezza (non testata):

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