Frage

NHibernate Noob hier. Suche nach Rat, wie die folgende gemeinsame Szenario abzubilden:

[Store]
id pk
Name

[Lager lieferbar]
id pk
Name

[StockItemStor]
id pk
StockItemId fk
StoreID fk
ParLevel

Ich habe eine domainmodel erstellt, die verschiedene Lagerware ermöglicht über das Lager lieferbar Entity zu verschiedenen Shops zugeordnet sein, um einen AssignToStore (Store store) Methode verwendet wird.

Ich bin jetzt mit nhibernate meines Db-Schema zu erstellen. Wie richte ich die Mapping-Dateien für dieses Basisszenario?

Alle möglichen Spitzen sehr geschätzt.

Chev

War es hilfreich?

Lösung

Leider ist diese Beziehung nicht die einfachste Sache in nHibernate zu modellieren und es gibt einige inhärente Probleme begegnen Sie bei dem Versuch, Abfragen auf die Daten in der Verknüpfungstabelle zu tun, die einige komplizierte Workarounds erfordern, aber wenn Sie es eingerichtet funktioniert es ganz gut.

Mein Ansatz dazu ist es einzurichten als zwei viele-zu-eins-Zuordnungen der folgenden Beziehung im Store-Mapping und die inversen Beziehung in dem Mapping-Lager lieferbar.

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

die Store-Klasse wird die folgende Sammlung haben:

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

und Lager lieferbar wird die inverse hat wieder:

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

Die StockItemStor Objekt ist in der Lage zu enthalten, entweder Objekt (Speicher oder Lager lieferbar) und jede zusätzliche Information, die in der Verknüpfungstabelle ist. (In diesem Fall nur die ParLevel.

je nachdem, welche Seite Sie am StockItemStor Objekt suchten entweder Store oder Lager lieferbar wird null. Es könnte ausgebrochenen in zwei Klassen, aber ich finde, diesen Ansatz einfacher zu handhaben. Es erfordert, dass Sie nur als Entwickler zu wissen, auf welcher Seite Sie es nähern sich aus, aber es ist ein guter Kompromiss für die Herstellung der Code einfacher und wiederverwendbar meiner Meinung nach

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

}

Mein Ansatz die einzige eindeutige Kennung in den StockItemStor nicht, wie Sie in Ihrer Frage definiert verwenden, sondern was auf einen zusammengesetzten Schlüssel in der Verknüpfungstabelle. Aber es hat mich in der Vergangenheit gut Gesamt serviert. Ich bin sicher, dass Sie diese ID in irgendwie Schuhanzieher könnte, wenn man es wirklich benötigt wird.

Dieser Ansatz funktioniert gut für die Verwendung von HQL abfragt. wenn Sie versuchen, verwenden ICriteria fragt es ein wenig wackelig zu bekommen neigt. Es gibt einige Lösungen gibt bei der Verwendung von Datenbankansichten eine andere Tabelle zu simulieren für Abfragen zu verwenden, die für mich gearbeitet hat.

Wenn Sie ICriteria Abfragen lassen Sie mich wissen zu tun, und ich kann einige Beispiel-Code schreiben.

  • Max

Andere Tipps

Ich würde Lesen auf nHibernate wird dringend empfohlen. Hier ist ein sehr guter Ausgangspunkt:

The nHibernate FAQ

Ich würde auch empfehlen, dass Sie die Zuordnungen von Hand tun, um die ersten paar Male. Danach sollten Sie fliessend nHibernate überprüfen. Fließend nHibernate kann (unter anderem) automatisch die Zuordnungen für Sie von Ihrem Domain-Modell generiert und hilft auch Ihnen das Datenbankschema zu generieren. Es ist ein sehr flexibles Werkzeug, das besser und besser wird. Sie finden es hier:

Fluent nHibernate

Viel Glück!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top