2009-12-16 14 views

risposta

213

NHibernate semantica:

  1. listino: ordinato insieme di entità, duplicare permesso. Utilizzare un codice .NET IList nel codice. La colonna dell'indice dovrà essere mappata in NHibernate.

  2. Set: raccolta non ordinata di entità univoche, duplicati non consentiti. Utilizzare Iesi.Collection.ISet nel codice (NH prima di v4) o System.Collections.Generic.ISet (NH v4 +). È importante sovrascrivere GetHashCode e Equals per indicare la definizione aziendale di duplicato. Può essere ordinato definendo un orderby o definendo un comparatore risultante in un risultato SortedSet.

  3. Borsa: elenco non ordinato di entità, duplicati consentiti. Utilizzare un codice .NET ICollection<T> nel codice. La colonna dell'indice della lista non è mappata e non onorato da NHibernate.

+16

3. dovrebbe essere ICollection nel codice no? – Firo

+0

Re: # 2, non possiamo usare solo 'ISet' normale invece di' Iesi'? –

+0

@SergeyTachenov: vedere http://stackoverflow.com/questions/9222058/can-net-4-iset-hashset-replace-nhibernate-iesi-collections-iset-hashset per una possibile risposta. Quando questa risposta è stata scritta, ISet non faceva parte di .net –

1

Bene, la differenza principale è che gli elenchi hanno un ordine implicito per gli elementi, indicizzati dalla loro posizione nell'elenco. Insiemi e borse possono anche essere "ordinati" di solito da un Comparatore o da una clausola order by applicata quando questi elementi escono dal DB. Personalmente, non ho mai usato le Borse ... se so che i dati che voglio sono ordinati sequenzialmente uso List altrimenti uso Set.

0

Set non consente di avere elementi ripetuti in esso. Se proverai ad aggiungere qualche nuovo elemento, esso confronterà (viene usato il metodo Equals) ogni elemento che è già in collezione con quello che aggiungi e se un retuns vero, l'elemento non verrà aggiunto

19

Tutti di 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 qui alcuni link e descrizioni.

Per informazioni più dettagliate dare un'occhiata a quanto segue: Lists, Sets e Bags

Le regole generali sono:

liste sono per default ordinato, utilizzare questi se si vuole essere in grado di estrarre un oggetto dal suo indice o si ha una strana predilezione di loop for su loop foreach. Non è necessario accedervi in ​​ordine come se fosse necessario in uno Linked List. Questo ADT consente duplicati.

Nota! Anche se gli elenchi sono ordinati come BryanD menzionato nella sua risposta, , non c'è assolutamente nulla che dice che deve essere nell'ordine che ci si aspetta dal database quando si esegue una query HQL a meno che non si specifichi un ordine per comando. È per questo che ad alcune persone piace usare Set o Bags, in modo che non dia l'illusione di essere ordinato. Anche se lo dico, la maggior parte delle volte sembra che siano in un ordine visibile, in quanto vengono aggiunti alla lista nell'ordine in cui vengono trovati nella query eseguita da NHibernate.

set sono non di default ordinato, non si può accedere a qualsiasi variabile direttamente tramite un indice. Gli insiemi sono di default il solo ADT dei tre precedenti che mantengono l'unicità dei suoi oggetti. Questi sono grandi se hai una collezione se non hai bisogno di contenere duplicati.

Borse (o multinsiemi) sono, come si può vedere dai link di cui sopra, un tipo di Set che fa permettono gli oggetti al suo interno per essere duplicati di altri oggetti. Questi non sono generalmente usati, poiché l'ordinamento delle liste può essere ignorato e quindi trattato come una borsa.

In relazione al modo in cui questi vengono utilizzati in NHibernate, nulla viene estratto dal database in modo diverso a seconda di quale ADT selezionato qui, è ciò che si desidera utilizzare per quello che dovrebbe farti scegliere il diverso ADT.

Personalmente, utilizzo gli insiemi per la maggior parte delle cose poiché in genere richiedono che gli oggetti figlio siano univoci e l'ordine non è un problema.Anche se userò Liste dove ho un gruppo di oggetti che voglio ordinati per qualcosa, per esempio il tempo, per raggiungere questo ordine ho bisogno di impostare manualmente "order by" nella query HQL.

+2

Correzione sull'elenco - utilizzando un elenco in un file di mapping NHibernate È necessario eseguire il mapping di una colonna di indice. In questo modo la lista verrà estratta nell'ordine esatto in cui è stata inserita. –

+0

@ Michael Gattuso Buon punto, avrei dovuto menzionare nella risposta sopra che stavo parlando di query HQL (da qui il commento "ordine per") piuttosto che la specifica di raccolta effettiva nel file di mappatura. – Jay

+0

Uno dei vantaggi dell'uso di borse è che non devono essere caricati dal database quando si aggiungono nuovi elementi. Nessun duplicato da controllare, nessun ordine da determinare. – tvaananen