Question

NHibernate noob ici. Vous recherchez des conseils sur la manière de mapper le scénario commun suivant:

[Boutique]
id pk
Nom

[StockItem]
id pk
Nom

[StockItemStore]
id pk
StockItemId fk
StoreId fk
NiveauPar

J'ai créé un modèle de domaine qui permet d'attribuer divers StockItems à différents magasins via l'entité StockItem à l'aide d'une méthode AssignToStore (magasin de magasin).

J'utilise maintenant nhibernate pour créer mon schéma de base de données. Comment configurer les fichiers de mappage pour ce scénario de base?

Tous les conseils sont grandement appréciés.

Chev

Était-ce utile?

La solution

Malheureusement, cette relation n’est pas la chose la plus facile à modéliser dans nHibernate et vous rencontrerez certains problèmes inhérents que vous rencontrerez en essayant de faire des requêtes sur les données dans la table de liens, ce qui nécessitera des solutions de contournement compliquées, mais une fois que vous les aurez mis en place cela fonctionne très bien.

Mon approche consiste à le configurer en deux mappages plusieurs à un avec la relation suivante dans le mappage Store et la relation inverse dans le mappage 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 classe Store aura la collection suivante:

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

et StockItem aura à nouveau l'inverse:

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

L'objet StockItemStore peut contenir un objet (Store ou StockItem) et toute information supplémentaire figurant dans la table de liaison. (dans ce cas, juste le niveau de niveau.

en fonction de quel côté vous regardez l'objet StockItemStore depuis Store ou StockItem sera nul. Cela pourrait être divisé en deux classes, mais je trouve cette approche plus facile à utiliser. En tant que développeur, vous devez simplement savoir de quel côté vous vous en approchez, mais c’est un bon compromis pour rendre le code plus simple et plus réutilisable à mon avis.

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

}

Mon approche n'utilise pas l'identificateur unique unique dans StockItemStore tel que vous l'avez défini dans votre question, mais plutôt ce qui équivaut à une clé composite dans la table de liaison. Mais dans l’ensemble, cela m’a bien servi. Je suis sûr que vous pourriez faire ce que vous recherchez si vous en aviez vraiment besoin.

Cette approche est idéale pour les requêtes utilisant HQL. si vous essayez d'utiliser des requêtes ICriteria, cela a tendance à être un peu risqué. Il existe certaines solutions avec l'utilisation de vues de base de données pour simuler une autre table à utiliser pour l'interrogation qui a fonctionné pour moi.

Si vous avez besoin d'effectuer des requêtes ICriteria, faites-le-moi savoir et je peux poster un exemple de code.

  • Max

Autres conseils

Je vous recommande fortement de lire sur nHibernate. Voici un très bon point de départ:

La FAQ nHibernate

Je vous recommanderais également de faire les correspondances à la main les deux premières fois. Après cela, vous devriez vérifier Fluent nHibernate. Fluent nHibernate peut (entre autres choses) générer automatiquement les mappages pour vous à partir de votre modèle de domaine et vous aider également à générer le schéma de base de données. C'est un outil très flexible qui va de mieux en mieux. Vous le trouverez ici:

nHibernate courant

Bonne chance!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top