Pregunta

NHibernate noob aquí. Buscando consejos sobre cómo mapear el siguiente escenario común:

[Tienda]
id pk
Nombre

[StockItem]
id pk
Nombre

[StockItemStore]
id pk
StockItemId fk
StoreId fk
ParLevel

He creado un modelo de dominio que permite asignar varios StockItems a varias tiendas a través de la entidad StockItem utilizando un método AssignToStore (Store store).

Ahora estoy usando nhibernate para crear mi esquema db. ¿Cómo configuro los archivos de mapeo para este escenario básico?

Cualquier consejo muy apreciado.

Chev

¿Fue útil?

Solución

Desafortunadamente, esta relación no es lo más fácil de modelar en nHibernate y hay algunos problemas inherentes que encontrará al intentar hacer consultas sobre los datos en la tabla de enlaces, que requerirán algunas soluciones complicadas, pero una vez que lo obtenga configurarlo funciona bastante bien.

Mi enfoque para esto es configurarlo como dos asignaciones de muchos a uno con la siguiente relación en la asignación de Tienda y la relación inversa en la asignación de StockItem.

<bag name="StockItems" table="StockItemStore" lazy="true">
  <key column="StoreId" />
  <composite-element class="SuperStore.Components.StockItemStore, SuperStore.Components">
    <property name="ParLevel" type="Int32" />
    <many-to-one name="StockItem" column="StockItemId" class="SuperStore.Components.StockItem, SuperStore.Components" fetch="join" cascade="all" />
  </composite-element>
</bag>

la clase Store tendrá la siguiente colección:

public virtual IList< StockItemStore > StockItems {get;set;}

y StockItem volverá a tener el inverso:

public virtual IList< StockItemStore > Stores {get;set;}

El objeto StockItemStore puede contener cualquier objeto (Store o StockItem) y cualquier información adicional que se encuentre en la tabla de enlaces. (en este caso, solo ParLevel.

dependiendo de qué lado esté mirando el objeto StockItemStore de Store o StockItem será nulo. Podría dividirse en dos clases, pero creo que este enfoque es más fácil de trabajar. Solo requiere que usted, como desarrollador, sepa desde qué lado se está acercando, pero es una buena compensación para hacer que el código sea más simple y más reutilizable en mi opinión

public class StockItemStore
{
    private StockItem stockItem;
    private Store store;

    public virtual StockItem StockItem
    {
        get
        {
            if (stockItem == null)
            {
                stockItem = new StockItem();
            }

            return stockItem;
        }
        set
        {
            stockItem = value;
        }
    }

    public virtual Store store
    {
        get
        {
            if (store == null)
            {
                store = new Store();
            }

            return store;
        }
        set
        {
            store = value;
        }
    }

    public virtual int ParLevel { get; set; }

}

Mi enfoque no utiliza el único identificador único en StockItemStore como lo definió en su pregunta, sino más bien lo que equivale a una clave compuesta en la tabla de enlaces. Pero me ha servido bien en el pasado en general. Estoy seguro de que podrías calzar esa identificación de alguna manera si realmente la necesitaras.

Este enfoque funciona muy bien para consultar utilizando HQL. Si está tratando de usar consultas ICriteria, tiende a ponerse un poco inestable. Existen algunas soluciones con el uso de vistas de bases de datos para simular otra tabla para consultas que me han funcionado.

Si necesita hacer consultas de ICriteria, hágamelo saber y puedo publicar un código de muestra.

  • Max

Otros consejos

Recomiendo leer en nHibernate. Aquí hay un muy buen punto de partida:

Las preguntas frecuentes de nHibernate

También recomendaría que haga las asignaciones a mano las primeras veces. Después de eso, deberías ver Fluido nHibernate. El nHibernate fluido puede (entre otras cosas) generar automáticamente las asignaciones para usted desde su modelo de dominio y también ayudarlo a generar el esquema de la base de datos. Es una herramienta muy flexible que está mejorando cada vez más. Lo encontrarás aquí:

nHibernate fluido

¡Buena suerte!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top