NHibernate: Warum würden Sie Composite-Element über eins-zu-viele verwenden, um eine Sammlung zuzuordnen?

8

Unter welchen Umständen würden Sie bei Verwendung von NHibernate eine Sammlung mit einem Composite-Element zuordnen, um eine Sammlung von Wertobjekten zu erhalten, statt eine vollständige Entität zu erstellen und sie mit Eins-zu-Vielen zuzuordnen?

Sie könnten eine Werttypklasse 'PostalAddress' haben, um eine Adresse darzustellen. Wenn Sie eine Personenentität hätten und jede Person viele Adressen hätte, könnten Sie diese Beziehung so abbilden (Option 1):

%Vor%

Oder Sie könnten eine Entität 'PersonAddress' erstellen, die eine 'PostalAddress' typisierte Eigenschaft besitzt und die Adressen mit einer Eins-zu-Viele-Zuordnung (Option 2) abbildet:

%Vor%

Gibt es Gründe, Option 1 nicht zu machen? Bietet die Tatsache, dass die PersonAddress-Tabelle eine ID-Spalte hat, an, dass es sich um eine Entität selbst handeln soll, und verwenden Sie daher die Option 2?

    
Matthew Winder 30.11.2010, 13:58
quelle

1 Antwort

19

& lt; zusammengesetztes Element & gt; ist, wenn Sie eine Sammlung von Werten haben, während & lt; eins zu viele & gt; ist eine Sammlung von Entitäten. Das definierende Merkmal einer Entität ist eine eindeutige Kennung. Wenn also die Objekte in Ihrer Sammlung eine PK haben, verwenden Sie & lt; Eins-zu-viele & gt ;. Andernfalls verwenden Sie & lt; Composite-Element & gt;.

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. In Ihrer Anwendung repräsentieren zwei Objekte die gleiche Adresse, wenn (Adresse1.Id == Adresse2.Id) oder wenn (Adresse1.Strasse == Adresse2.Strasse & amp; Adresse1.Stadt == Adresse2.Stadt & amp; etc .) 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 ...

    
James Kovacs 30.11.2010, 17:27
quelle