4 Stimmen

Wie bildet man eine Collection<T> in NHibernate ab?

Ich habe eine Klasse "Kontakt" (Basisklasse), eine Klasse "Kunde" und eine Klasse "Lieferant". Die Klassen Kunde und Lieferant leiten sich beide von der Klasse Kontakt ab.

Kunde hat eine 0..n-Beziehung mit Auftrag. Ich möchte eine Collection-Eigenschaft für den Kunden haben und diese in NHibernate auf die entsprechende Tabelle abbilden lassen.

Wie wird dies in NHibernate (Version 2.0.1 GA) durchgeführt?

(ps: verwendet .NET 3.5 SP1, VS2008 SP1)

4voto

Frederik Gheysels Punkte 54908

Dies wird folgendermaßen durchgeführt:

Erstellen Sie Ihre Klasse wie folgt:

public class Customer  : Contact
{
   private ISet<Order> _orders = new HashedSet<Order>();

   public Collection<Order> Orders
   {
      return new List<Order>(_orders);
   }

   // NOrmally I would return a ReadOnlyCollection<T> instead of a Collection<T>
   // since I want to avoid that users add Orders directly to the collection.
   // If your relationship is bi-directional, then you have to set the other
   // end of the association as well, in order to hide this for the programmer
   // I always create add & remove methods (see below)

   public void AddOrder( Order o )
   {
      if( o != null && _orders.Contains(o) == false )
      {
         o.Customer = this;
         _orders.Add(o);
      }
   }
}

in Ihrem Mapping, geben Sie dies an:

<set name="Orders" table="OrdersTable" access="field.camelcase-underscore" inverse="true">
   <key column="..." />
   <one-to-many class="Order" .. />
</set>

Da Sie Vererbung verwenden, sollten Sie sich auf jeden Fall die verschiedenen Möglichkeiten des Vererbungsmappings in NHibernate ansehen und die Strategie wählen, die für Ihre Situation am besten geeignet ist: Vererbungsabbildung

Bezüglich der Semantik von Mengen und Beuteln: - Wenn Sie eine Sammlung als Menge abbilden, können Sie sicher sein, dass alle Entitäten in der abgebildeten Sammlung eindeutig sind. Das heißt, NHibernate stellt sicher, dass die Sammlung bei der Wiederherstellung einer Instanz keine Duplikate enthält. - Wenn Sie die Sammlung als Tasche abbilden, ist es möglich, dass Ihre Sammlung die gleiche Entität mehr als einmal enthält, wenn das Objekt aus der DB geladen wird.

  • Eine Menge ist eine Sammlung von verschiedenen Objekten, die als Ganzes betrachtet werden. A gültiges Beispiel für eine Menge (von Buchstaben) ist: { a, b, c, d }. Jeder Buchstabe kommt genau einmal vor.
  • Ein Beutel ist eine Verallgemeinerung einer Menge. A Mitglied eines Beutels kann mehr als eine Mitgliedschaft haben, während jedes Mitglied einer Menge nur eine Zugehörigkeit hat. Ein gültiges Beispiel für einen Beutel ist { a, a, a, b, c, c, d, ...}. Die Buchstaben a und c kommen mehr als einmal in der Tüte vor.

1voto

Stefan Steinegger Punkte 62197

Eine andere Lösung, wenn Sie das Set aus den Iesi-Kollektionen nicht verwenden möchten

public class Customer  : Contact
{
   public ICollection<Order> Orders
   {
      get; private set;

   }
}

Und das Mapping sieht so aus:

<bag name="Orders" table="Customer_Orders" >
   <key column="Customer_FK" />
   <composite-element>
     <property name="OrderNumber" />
     <property name="OrderName" />
     <!-- ... -->
   </composite-element>
</set>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X