Risposte:
Semantica ibernata:
Elenco: raccolta ordinata di entità, duplicati consentiti. Usa un .NET IList
nel codice. La colonna dell'indice dovrà essere mappata in NHibernate.
Set: raccolta non ordinata di entità uniche, duplicati non consentiti. Utilizzare Iesi.Collection.ISet
nel codice (NH prima della v4) o System.Collections.Generic.ISet
(NH v4 +). È importante sovrascrivere GetHashCode
e Equals
indicare la definizione aziendale di duplicato. Può essere ordinato definendo un orderby o definendo un comparatore che dia un SortedSet
risultato.
Borsa: elenco di entità non ordinato, duplicati consentiti. Usa un .NET ICollection<T>
nel codice. La colonna dell'indice dell'elenco non è mappata e non viene rispettata da NHibernate.
Tutti questi oggetti in NHibernate sono esattamente gli stessi di altre implementazioni di questi tipi di dati astratti (ADT). Sono rimasto sorpreso di quanto sia difficile trovare set e borse online a causa di quanto siano comuni i nomi per altre cose, quindi ho elencato alcuni link e descrizioni qui.
Per informazioni più dettagliate dai un'occhiata a quanto segue: Liste , Set e Borse
Le regole generali sono:
Gli elenchi sono ordinati per impostazione predefinita, usali se vuoi essere in grado di estrarre un oggetto dal suo indice o hai una strana predilezione per i for
loop su foreach
loop. Non è necessario accedervi nell'ordine in cui sarebbe necessario in un elenco collegato . Questo ADT consente duplicati.
Notare che! Sebbene le liste siano ordinate come BryanD ha menzionato nella sua risposta, non c'è assolutamente nulla che dica che deve essere nell'ordine che ti aspetti dal database quando esegui una query HQL a meno che non specifichi un ordine tramite comando. È per questo che ad alcune persone piace usare Set o Bags, in modo che non dia l'illusione di essere ordinati. Anche se lo dico, la maggior parte delle volte appariranno in un ordine visibile, poiché vengono aggiunti all'elenco nell'ordine in cui si trovano nella query eseguita da NHibernate.
Gli insiemi non sono ordinati per impostazione predefinita, non è possibile accedere a nessuna variabile direttamente tramite un indice. I set sono per impostazione predefinita l' unico ADT tra i tre precedenti che mantengono l'unicità dei suoi oggetti . Questi sono ottimi se hai una collezione se hai bisogno di non contenere duplicati.
I sacchetti (o Multiset ) sono, come puoi vedere dai link sopra, un tipo di Set che consente agli oggetti al suo interno di essere duplicati di altri oggetti. Questi non sono generalmente usati, poiché l'ordine delle liste può essere ignorato e quindi trattato come un sacchetto.
In relazione a come questi vengono utilizzati in NHibernate, nulla viene estratto dal database in modo diverso a seconda di quale ADT selezioni qui, è ciò per cui vuoi usarlo che dovrebbe farti scegliere il diverso ADT.
Personalmente, utilizzo i set per la maggior parte delle cose poiché generalmente richiedo che gli oggetti figlio siano univoci e l'ordinamento non è un problema. Anche se userò gli elenchi in cui ho un gruppo di oggetti che desidero ordinato in base a qualcosa, ad esempio il tempo, per ottenere questo ordine ho bisogno di impostare manualmente l '"ordine per" nella query HQL.
Ebbene, la differenza principale è che le liste hanno un ordinamento implicito degli elementi, indicizzato dalla loro posizione nella lista. I set e le borse possono anche essere "ordinati" solitamente da un Comparatore o da una clausola order by applicata quando tali articoli escono dal DB. Personalmente non ho mai usato Borse ... se so che i dati che desidero sono ordinati in sequenza utilizzo List altrimenti utilizzo Set.
ISet
invece diIesi
?