visual studio net framework nhibernate

net - nhibernate visual studio 2017



Lista vs Set vs Bolsa en NHibernate (4)

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.

¿Cuál es la diferencia entre una lista, conjunto y bolsa en el archivo de mapeo de NHibernate? ¿Cómo se relaciona cada uno con las colecciones de .NET?


Establecer 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á


Semántica NHibernate:

  1. Lista: colección ordenada de entidades, duplicado permitido. 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 anular GetHashCode e Equals para indicar la definición comercial de duplicado. Puede ordenarse definiendo un pedido por o definiendo un comparador que resulte en un resultado SortedSet .

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


Todos estos objetos en NHibernate son exactamente los mismos que en 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, consulte lo siguiente: Lists , Sets y Bags

Las reglas generales son:

Las listas se ordenan por defecto, utilícelas si desea extraer un objeto por su índice o tiene una afición extraña for bucles for foreach . No es necesario que accedas a ellos en orden tal como lo necesitarías en una lista vinculada . Este ADT permite duplicados.

¡Tenga en cuenta! Aunque las listas se ordenan como BryanD se menciona en su respuesta, no hay absolutamente nada que diga que debe 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 por esto que a algunas personas les gusta usar Set o Bags en su lugar, de modo que no da la ilusión de que se les ordene. 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.

Los conjuntos no están ordenados por defecto, no se puede acceder a ninguna variable directamente a través de un índice. Los conjuntos son por defecto el único 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.

Las bolsas (o Multisectos ) son, como se puede ver en los enlaces anteriores, un tipo de Conjunto que permite que los objetos dentro de él sean 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 la forma en que se usan en NHibernate, no se extrae nada de la base de datos de manera diferente según el ADT que seleccione aquí, es lo que desea usar para eso, lo que debería hacer que elija los diferentes ADT.

Personalmente, utilizo Sets para la mayoría de las cosas, ya que generalmente requiero 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.