2013-03-19 4 views
5

Ich habe einen Beitrag im Internet gelesen (ich kann diesen Beitrag für mich nicht mehr finden), dass eine Viele-zu-Viele-Beziehung durch eine Eins-zu-viele-Beziehung ersetzt werden kann. Kann jemand ein Beispiel geben?Nhibernate: Wie viele-zu-viele Beziehungen mit One-to-Many-Beziehungen darstellen?

+0

Bitte beschreiben Sie Ihre Tabellen und welche Klassen Sie verwenden möchten. – cremor

+3

Da relationale DBMSs normalerweise keine Viele-zu-Viele-Beziehungen unterstützen, werden diese Beziehungen mithilfe einer Verknüpfungstabelle und zweier Eins-zu-Viele-Beziehungen dargestellt. Zum Beispiel wird eine Viele-zu-Viele-Beziehung zwischen "Benutzern" und "Rollen" als "Benutzer eins-zu-viele-Benutzer-Rollen viele-zu-eins-Rolle" ausgedrückt. NHibernate verbirgt dies normalerweise und ermöglicht viele-zu-viele Beziehungen transparent. Wenn Sie möchten, können Sie immer wählen, die Verknüpfungstabelle explizit zuzuordnen, dh. Sie würden "User", "Role" und "UserRoles" zuordnen, wobei "UserRoles" zwei Viele-zu-Eins-Beziehungen (zu einem "User" bzw. einer "Role") enthält. –

+0

(Fortsetzung).In diesem Fall müssen weder "User" noch "Role" Sammlungen (one-to-many) von "UserRoles" -Instanzen enthalten (oder zumindest können sie umgekehrt sein). Dies kann nützlich sein, um den Speicherbedarf zu reduzieren, da weniger Sammlungen in den Speicher geladen werden müssen. Der Nachteil ist, dass Abfragen komplexer werden. –

Antwort

11

Ich komme nur zu dieser Frage und erkannte, dass es keine Antwort gibt. Und es ist eine Schande, während ich oft auf diese NHibernate Dokumentationsanweisung hinweisen: 24. Best Practices

Verwenden Sie keine exotischen Zuordnung Zuordnungen.

Gute Anwendungsfälle für eine echte Viele-zu-Viele-Assoziationen sind selten. Most of die Zeit, die Sie benötigen zusätzliche Informationen in der "Linktabelle" gespeichert. In diesem Fall ist es viel besser, zwei One-to-Many-Zuordnungen zu einer Zwischenverbindungsklasse zu verwenden. In der Tat denken wir, dass die meisten Assoziationen eins-zu-viele und viele-zu-eins sind, Sie sollten vorsichtig sein, wenn Sie einen anderen Assoziationsstil verwenden und sich fragen, ob es wirklich notwendig ist.

Werfen Sie einen Blick auf das Beispiel unter der 23.2. Author/Work. Extrakt, der vereinfachte Version der many-to-many-Beziehung zwischen Author und Work:

<class name="Work" table="works" ...> 
     <id name="Id" column="id" generator="native" /> 
     ... 
     <set name="Authors" table="author_work" lazy="true"> 
      <key> 
       <column name="work_id" not-null="true"/> 
      </key> 
      <many-to-many class="Author"> 
       <column name="author_id" not-null="true"/> 
      </many-to-many> 
     </set> 
</class> 

Und seine many-to-many Ziel Autor:

<class name="Author" table="authors"> 
    ... 
    <set name="Works" table="author_work" inverse="true" lazy="true"> 
    <key column="author_id"/> 
    <many-to-many class="Work" column="work_id"/> 
    </set> 
</class> 

Also, wenn wir bestellen möchten Die Menge von Works on load, wir haben ein Problem. In der Paartabelle gibt es keine Spalte. Aber was noch wichtiger ist, es gibt keine Möglichkeit, eine solche Spalte zu verwalten.

Was können wir tun, ist, um das Objekt Pair eingeführt: AuthorWork und das Paar Tisch erstrecken, wie

benötigt
public class AuthorWork 
{ 

    public virtual Author Author { get; set; } 
    public virtual Work Work { get; set; } 
    public virtual int OrderBy { get; set; } 
} 

Mapping der diese AuthorWork

<class name="AuthorWork" table="author_work"> 
    ... 
    <many-to-one name="Author" column="author_id" /> 
    <many-to-one name="Workr" column="work_id" /> 
    <property name="OrderBy" /> 

Nachdem wir die viel umwandeln kann Zu viele Zuordnungen zu eins-zu-vielen, z. B. der Autorensammlung:

<set name="Authors" lazy="true" 
    order-by="OrderBy"> 
    <key column="work_id" not-null="true"/> 
    <one-to-many class="AuthorWork" /> 
</set> 

Und wir können die Entität AuthorWork verwalten, die OrderBy-Spalte festlegen und daher effektiv mit der Paarungstabelle arbeiten.

HINWEIS: muss diesem Vorschlag in der Dokumentation zustimmen Je mehr Anforderungen kommen, desto glücklicher sind wir, dass wir eine Möglichkeit haben, die Beziehung zu verwalten!

+4

Heads up die Best Practices Link ist umgezogen zu: http://nhibernate.info/doc/nh/en/index.html#example-mappings-authorwork – mcfea