2009-12-21 7 views
12

Fluent NHibernate non piace questo, gettando un errore:Fluente NHImpara l'automapping di Lista <string>?

{"Association references unmapped class: System.String"}

bene OK, posso capire perché questo causerebbe un problema - ma qual è la soluzione migliore?

Non voglio davvero che memorizzi un elenco delimitato di stringhe in un singolo campo, questo risulterebbe brutto se la mia lista contiene molte stringhe.

Anche io non voglio una tabella "stringa", per ovvi motivi.

Immagino di poter risolvere questo problema avvolgendo il mio List<string> all'interno di una classe, ma questo sembra un po 'pesante. Sto iniziando a pensare che sia la soluzione migliore però.

Qual è il modo migliore per ottenere Fluent NHibernate per gestire questo?

Mi aspetto che questi valori vengano memorizzati in un'altra tabella. Ho pensato che forse potrei essere in grado di configurare alcune convenzioni di automapping che istruiscano NHibernate "Se vedi un class X che contiene List<*some primitive type*>, allora vai avanti e crea automaticamente una tabella di riferimento che mappa questa raccolta.

Sembra un po 'pesante andare e avvolgere ogni singola raccolta in una classe. Se questa è la soluzione migliore, allora così sia.

+1

se non lo si desidera come stringa delimitata in un singolo campo e non lo si desidera in un'altra tabella, quindi * dove *? questo è ancora un database relazionale ... –

+0

Non sono infastidito da come il database relazionale gestisce questo. Mi chiedo come posso ottenere che la mappatura automatica deduca questo è ciò che voglio fare per * tutti * gli elenchi di stringhe nel mio modello di dominio. – Alex

+0

@Alex: per quanto ne so, non c'è modo di dire a Fluent NHibernate come mappare TUTTI gli elenchi di stringhe. La soluzione che fornisco nella mia risposta richiede un override per ciascuna lista di stringhe nel tuo modello di dominio. Sono solo un paio di righe di codice per ogni override, quindi non è male ... –

risposta

7

Ho avuto lo stesso identico problema qualche settimana fa, con i float al posto delle stringhe.

how-do-you-automap-listfloat-or-float-with-fluent-nhibernate

Si scopre che Automapping non funziona con tipi primitivi.

Edit - Questo non è più vero - la squadra FNH ha risolto il problema

C'è un sacco di codice di esempio nella risposta accettata alla mia domanda, ma il punto chiave è quello di aggiungere un override per la vostra gli elenchi dei tipi primitivi ("RawY" nell'esempio qui sotto):

public class DlsAppOverlordExportRunData 
{ 
    public virtual int Id { get; set; } 
    // Note: List<float> needs overrides in order to be mapped by NHibernate. 
    // See class DlsAppOverlordExportRunDataMap. 
    public virtual IList<float> RawY { get; set; } 
} 


// Must be in different namespace from DlsAppOverlordExportRunData!!! 
public class DlsAppOverlordExportRunDataMap : IAutoMappingOverride<DlsAppOverlordExportRunData> 
{ 
    public void Override(AutoMapping<DlsAppOverlordExportRunData> mapping) 
    { 
     // Creates table called "RawY", with primary key 
     // "DlsAppOverlordExportRunData_Id", and numeric column "Value" 
     mapping.HasMany(x => x.RawY) 
       .Element("Value"); 
    } 
} 

mi aspetto lo stesso approccio di lavorare con ILists di stringhe.

+0

Ok questo sembra interessante. È qualcosa che può essere definito tramite convenzioni? Sembra che FNH si concentri sulle convenzioni per personalizzare l'automapping. – Alex

+0

Io non la penso così. Ho ottenuto la soluzione ponendo la domanda sulla mailing list di Fluent, e credo che sia stato uno degli autori FNH a darlo a me. Se potesse essere fatto da una singola convenzione, penso che lo avrebbe suggerito. –

1

Pensa in questo modo ... come lo faresti senza ibernazione? Beh, probabilmente avresti un tavolo con una chiave esterna e una colonna di stringhe? Ora, come lo fai con Hibernate? Si imposta un'altra classe con una proprietà many-to-one e stringa. Quindi mappare una raccolta di tale classe.

+0

Ok, punto preso. Semplicemente non mi piace dover creare tutte queste classi assolutamente banali per avvolgere collezioni primitive. Posso avere l'automapping per dedurlo? – Alex

+0

Oh, quindi non è necessario creare un'altra classe? Penso che sia possibile ... http: //nhforge.org/doc/nh/en/index.html#collections-ofvalues ​​vedere come hanno dato un esempio di un insieme di ints, sembra che tu faccia una collezione regolare quindi definire un proprietà dell'elemento per la stringa. – dotjoe

4

Da quando ho inviato la mia prima risposta, il team di Fluent NHibernate ha risolto questo problema.

Ora è possibile automatizzare i tipi di valori ILists di C# (stringhe, int, float, ecc.).

Assicurati solo di avere una versione recente di FNH.

+0

Purtroppo, questo è quasi un anno di ritardo per i miei bisogni - nonostante sia bello vedere FNH implementato, è stato l'unico vero ostacolo che ho incontrato quando lo utilizzavo per una grande app LOB. – Alex

+0

Kudos Tom per tornare un anno dopo per fornire questo aggiornamento. – MushinNoShin