2010-11-30 1 views
8

Wenn Sie NHibernate verwenden, unter welchen Umständen würden Sie eine Sammlung mithilfe eines Composite-Elements einer Auflistung von Wertobjekten zuordnen und nicht erstellen eine vollständige Entität und kartieren sie mit Eins-zu-Viele?NHibernate: Warum würden Sie <composite-element> über <one-to-many> verwenden, um eine Sammlung zuzuordnen

Sie könnten eine Werttypklasse 'PostalAddress' haben, um eine Adresse darzustellen. Wenn Sie eine Person Unternehmen und jede Person hatte viele Adressen haben könnten Sie könnten diese Beziehung wie folgt aus (Option 1) Karte:

<bag name="Addresses" table="PersonAddress"> 
    <key column="PersonID"/> 
    <composite-element class="PostalAddress"> 
     <property name="StreetAddress"/> 
     <property name="Town"/> 
     <property name="City"/> 
     <property name="Postcode"/> 
    </composite-element> 
</bag> 

Oder Sie könnten eine Entität ‚PersonAddress‘, die eine ‚Postal‘ typisierte Eigenschaft hat erstellen auf sie und ordnen sie die Adressen mit einem one-to-many-Verband (Option 2):

<bag name="Addresses"> 
    <key column="PersonID"/> 
    <one-to-many class="PersonAddress"/> 
</bag> 

<class name="PersonAddress"> 

    <id name="Id"> 
     <generator class="native"/> 
    </id> 

    <component name="Address" class="PostalAddress"> 
     <property name="StreetAddress"/> 
     <property name="Town"/> 
     <property name="City"/> 
     <property name="Postcode"/> 
    </component> 

</class> 

gibt es Gründe, nicht zu tun Option 1? Stellt die Tatsache, dass die PersonAddress-Tabelle eine ID-Spalte hat, darauf hin, dass es sich um eine Entität selbst handeln sollte, und verwenden Sie daher Option 2?

Antwort

19

<Verbundelement> ist, wenn Sie eine Sammlung von Werten während < one-to-many > ist eine Sammlung von Objekten. Das definierende Merkmal einer Entität ist eine eindeutige Kennung. Wenn also die Artikel in Ihrer Sammlung eine PK haben, verwenden Sie < eins zu viele >. Ansonsten verwenden Sie < Composite-Element >.

Eine andere Möglichkeit, darüber nachzudenken, ist, wie Sie die Gleichheit bestimmen. Bestimmen Sie die Gleichheit, indem Sie eine ID vergleichen oder überprüfen, ob alle Eigenschaften identisch sind? z.B. Stellen zwei Objekte in Ihrer Anwendung die gleiche Adresse dar, wenn (Adresse1.Id == Adresse2.Id) oder wenn (Adresse1.Strasse == Adresse2.Straße & & Adresse1.Stadt == Adresse2.Stadt & & usw.)? Es gibt keine universelle richtige Antwort, da sie vom Anwendungskontext abhängt. In vielen Fällen ist Geld ein Wertobjekt. Ob Sie diese $ 20 oder diese $ 20 haben, spielt keine Rolle. Nur der Betrag ist relevant. Wenn Sie eine Tracking-Anwendung für eine Münze schreiben, müssen sie wahrscheinlich wissen, mit welcher 20-Dollar-Rechnung Sie es zu tun haben, und Sie würden die Seriennummer auf der 20-Dollar-Rechnung verfolgen. In diesem Fall ist Geld eine Einheit. Es hängt alles von der Anwendung und dem Kontext ab ...

Verwandte Themen