Pergunta

NHibernate do noob aqui. Procurando conselhos sobre como mapear o seguinte cenário comum:

[loja]
id pk
Nome

[StockItem]
id pk
Nome

[StockItemStore]
id pk
StockItemId fk
StoreId fk
ParLevel

Eu criei um domainmodel que permite que vários StockItems a ser atribuído a várias lojas através da Entidade StockItem usando um método AssignToStore (loja Store).

Agora estou usando nhibernate para criar meu esquema db. Como faço para configurar os arquivos de mapeamento para esse cenário básico?

Todas as dicas muito apreciada.

Chev

Foi útil?

Solução

Infelizmente, este relacionamento não é a coisa mais fácil de modelo em nHibernate e existem alguns problemas inerentes que você vai encontrar ao tentar fazer consultas sobre os dados na tabela de ligação, que vai exigir algumas soluções complicadas, mas uma vez que você obtê-lo configurar ele funciona muito bem.

A minha abordagem para isso é configurá-lo como dois mapeamentos de muitos-para-um com a seguinte relação no mapeamento loja e a relação inversa no mapeamento 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>

a classe loja terá a seguinte coleção:

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

e StockItem terá o inverso novamente:

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

O objeto StockItemStore é capaz de conter qualquer objeto (loja ou StockItem) e qualquer informação adicional que está na tabela de ligação. (Neste caso, apenas o ParLevel.

dependendo de qual lado você está olhando para o objeto StockItemStore a partir de qualquer loja ou StockItem será nulo. Pode ser divididas em duas classes, mas acho que esta abordagem mais fácil trabalhar com. Ela exige apenas que você como o desenvolvedor de saber de que lado você está aproximando-o de, mas é um bom compromisso para tornar o código mais simples e reutilizável na minha opinião

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; }

}

A minha abordagem não usa o identificador único único no StockItemStore como você definiu na sua pergunta, mas sim o que equivale a uma chave composta na tabela ligando. Mas ele tem me servido bem no passado em geral. Tenho certeza que você poderia encaixar esse id em alguma forma, se você realmente precisava.

Esta abordagem funciona muito bem para a consulta usando HQL. se você está tentando usar ICriteria consulta tende a ficar um pouco vacilante. Existem algumas soluções lá fora, com o uso de visualizações de banco de dados para simular outra tabela a ser usada para a consulta que têm trabalhado para mim.

Se você precisa fazer consultas ICriteria deixe-me saber e eu posso postar alguns exemplos de código.

  • Max

Outras dicas

Eu recomendaria fortemente lendo sobre nHibernate. Aqui está um bom ponto de partida:

O nHibernate FAQ

Eu também recomendo que você faça os mapeamentos pela mão do primeiro par de vezes. Depois disso, você deve verificar Fluente nHibernate. Fluente nHibernate pode (entre outras coisas) gerar automaticamente os mapeamentos para você do seu modelo de domínio e também ajudá-lo a gerar o esquema de banco de dados. É uma ferramenta muito flexível que está ficando melhor e melhor. Você vai encontrá-lo aqui:

Fluente nHibernate

Boa sorte!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top