2009-12-16 11 views

Respuesta

213

la semántica de NHibernate:

  1. lista: Colección ordenada de entidades, duplicadas permitidas. Use un .NET IList en el código. La columna de índice deberá estar asignada en NHibernate.

  2. Conjunto: colección desordenada de entidades únicas, duplicados no permitidos. Use Iesi.Collection.ISet en el código (NH anterior a v4) o System.Collections.Generic.ISet (NH v4 +). Es importante sobrescribir GetHashCode y Equals para indicar la definición comercial de duplicado. Puede ordenarse definiendo un pedido por o definiendo un comparador que dé como resultado un resultado de SortedSet.

  3. Bolsa: Lista desordenada de entidades, duplicados permitidos. Use un .NET ICollection<T> en el código. La columna de índice de la lista no está asignada y no cumple NHibernate.

+16

3. debería ser ICollection en el código no? – Firo

+0

Re: # 2, ¿no podemos usar simplemente 'ISet' regular en lugar de' Iesi'? –

+0

@SergeyTachenov: vea http://stackoverflow.com/questions/9222058/can-net-4-iset-hashset-replace-nhibernate-iesi-collections-iset-hashset para obtener una posible respuesta. Cuando se escribió esta respuesta, ISet no formaba parte de .net –

1

Bueno, la principal diferencia es que las listas tienen un orden implícito a los elementos, indexados por su posición en la lista. Los conjuntos y las bolsas también pueden ser "pedidos" generalmente por un Comparador o una cláusula de orden por que se aplica cuando esos elementos salen de la base de datos. Personalmente, nunca he usado Bags ... si sé que los datos que deseo se ordenan secuencialmente, uso List; de lo contrario, uso Set.

0

El conjunto no le permite tener elementos repetidos en él. Si intenta agregar algún elemento nuevo, comparará (se usa el método Equals) cada elemento que ya está en la colección con el que está agregando, y si uno vuelve a ser verdadero, el elemento no se agregará

19

Todos estos objetos en NHibernate son exactamente lo mismo que otras implementaciones de estos Tipos de datos abstractos (ADT). Me sorprendió lo difícil que es encontrar conjuntos y bolsos en línea debido a lo comunes que son los nombres para otras cosas, así que he enumerado algunos enlaces y descripciones aquí.

Para obtener información más detallada echar un vistazo a los siguientes: Lists, Sets y Bags

Las reglas generales son:

Listas son por defecto ordenó, utilizar estos si desea ser capaz de sacar un objeto por su índice o tiene una afición extraña de for bucles sobre foreach bucles. No es necesario que accedas a ellos en orden como lo necesitarías en un Linked List. Este ADT permite duplicados.

¡Atención! Aunque las listas se ordenan como BryanD se menciona en su respuesta, , no hay absolutamente nada que indique que tiene que estar en el orden que espera de la base de datos cuando ejecuta una consulta HQL a menos que especifique una orden por comando. Es debido a esto que a algunas personas les gusta usar Set o Bags en su lugar, por lo que no da la ilusión de que se lo pidan. Aunque digo esto, la mayoría de las veces parecerán estar en un orden visible, ya que se agregan a la lista en el orden en que se encuentran en la consulta que ejecuta NHibernate.

Conjuntos son no por defecto ordenó, no se puede acceder a cualquier variable directamente a través de un índice. Los conjuntos son por defecto el solo ADT de los tres anteriores que mantienen la singularidad de sus objetos. Estos son excelentes si tiene una colección si necesita no contener duplicados.

Bolsas (o conjuntos múltiples ) son, como se puede ver en los enlaces de arriba, un tipo de conjunto, que sí permite a los objetos dentro de él para ser duplicados de otros objetos. Estos no se usan generalmente, ya que el orden de las Listas se puede ignorar y, por lo tanto, se puede tratar como una Bolsa.

En relación con cómo se utilizan en NHibernate, no se extrae nada de la base de datos de forma diferente según el ADT que seleccione aquí, es lo que desea usar para que pueda elegir entre los diferentes ADT.

Personalmente, utilizo Sets para la mayoría de las cosas, ya que generalmente exijo que los objetos secundarios sean únicos y ordenar no es un problema.Aunque usaré Lists donde tengo un grupo de objetos que deseo ordenado por algo, por ejemplo tiempo, para lograr este orden necesito configurar manualmente el "orden por" en la consulta HQL.

+2

Corrección en la lista - utilizando una lista en un archivo de mapeo NHibernate. Será necesario mapear una columna de índice. De esta forma, la lista se extraerá en el orden exacto en que fue colocada. –

+0

@Michael Gattuso. Buen punto, debería haber mencionado en la respuesta anterior que estaba hablando de consultas HQL (de ahí el comentario 'ordenar por') en lugar de la especificación de la colección real en su archivo de mapeo. – Jay

+0

Una de las ventajas del uso de bolsas es que no tienen que cargarse de la base de datos cuando se agregan elementos nuevos. No hay duplicados para verificar, no hay orden para determinar. – tvaananen