Domanda

NHibernate noob qui. In cerca di consigli su come mappare il seguente scenario comune:

[Store]
id pk
Nome

[StockItem]
id pk
Nome

[StockItemStore]
id pk
StockItemId fk
StoreId fk
ParLevel

Ho creato un modello di dominio che consente a vari StockItems di essere assegnati a vari Store tramite l'entità StockItem usando un metodo AssignToStore (Store store).

Ora sto usando nhibernate per creare il mio schema db. Come posso impostare i file di mappatura per questo scenario di base?

Qualche suggerimento molto apprezzato.

Chev

È stato utile?

Soluzione

Sfortunatamente questa relazione non è la cosa più semplice da modellare in nHibernate e ci sono alcuni problemi intrinseci che incontrerai quando provi a fare query sui dati nella tabella di collegamento, che richiederà alcune soluzioni complicate, ma una volta che lo ottieni installarlo funziona abbastanza bene.

Il mio approccio a questo è quello di configurarlo come due mapping molti-a-uno con la seguente relazione nella mappatura Store e la relazione inversa nella mappatura 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 avrà la seguente raccolta:

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

e StockItem avranno di nuovo l'inverso:

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

L'oggetto StockItemStore è in grado di contenere l'oggetto (Store o StockItem) e tutte le informazioni aggiuntive presenti nella tabella di collegamento. (in questo caso solo il ParLevel.

in base a quale lato stai guardando l'oggetto StockItemStore da Store o StockItem sarà nullo. Potrebbe essere suddiviso in due classi, ma trovo più facile lavorare con questo approccio. Ti richiede solo come sviluppatore di sapere da quale parte ti stai avvicinando, ma è un buon compromesso per rendere il codice più semplice e riutilizzabile secondo me

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

}

Il mio approccio non utilizza il singolo identificatore univoco in StockItemStore come definito nella domanda, ma piuttosto ciò che equivale a una chiave composita nella tabella di collegamento. Ma nel complesso mi è servito bene. Sono sicuro che potresti farlo in un modo o nell'altro se ne avessi davvero bisogno.

Questo approccio funziona benissimo per le query usando HQL. se stai cercando di usare le query ICriteria tende a diventare un po 'traballante. Ci sono alcune soluzioni là fuori con l'utilizzo di viste del database per simulare un'altra tabella da utilizzare per le query che hanno funzionato per me.

Se hai bisogno di fare domande ICriteria fammi sapere e posso pubblicare un codice di esempio.

  • Max

Altri suggerimenti

Consiglio vivamente di leggere su nHibernate. Ecco un ottimo punto di partenza:

Le domande frequenti su nHibernate

Vorrei anche raccomandare di eseguire i mapping a mano le prime due volte. Successivamente, dovresti dare un'occhiata a Fluent nHibernate. Fluente nHibernate può (tra le altre cose) generare automaticamente i mapping per te dal tuo modello di dominio e anche aiutarti a generare lo schema del database. È uno strumento molto flessibile che sta migliorando sempre di più. Lo troverai qui:

nHibernate fluente

Buona fortuna!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top