2013-03-19 13 views
5

Przeczytałem post w Internecie (nie mogę już znaleźć tego postu dla mnie), że relację wiele do wielu można zastąpić relacją jeden do wielu. Czy ktoś może podać przykład?Nhibernate: jak reprezentować wiele do wielu relacji w relacjach One-to-Many?

+0

Proszę opisać swoje tabele i klasy, których chcesz używać. – cremor

+3

Ponieważ relacyjne bazy DBMS zazwyczaj nie obsługują relacji wiele do wielu, relacje te są reprezentowane za pomocą tabeli łączenia i dwóch relacji jeden do wielu. Na przykład relacja wiele do wielu między 'User's i' Role 'jest wyrażana jako 'User jeden-do-wielu UserRoles wiele-do-jednego Rola'. NHibernate zwykle ukrywa to i umożliwia przezroczystą relację wiele do wielu. Jeśli chcesz, możesz zawsze bezpośrednio zamapować tabelę powiązań, np. zamapowałbyś 'User',' Role' _and_ 'UserRoles', gdzie' UserRoles' zawiera dwie relacje wiele-do-jednego (odpowiednio z "Użytkownikem" i "Role"). –

+0

(ciąg dalszy).W tym przypadku ani 'User' ani' Role' nie będą musiały przechowywać kolekcji (jeden-do-wielu) instancji "UserRoles" (lub przynajmniej mogą być odwrotne). Może to być przydatne w celu zmniejszenia śladu pamięci, ponieważ trzeba załadować mniejszą liczbę zbiorów do pamięci. Minusem jest to, że zapytania stają się bardziej złożone. –

Odpowiedz

11

Po prostu podchodzę do tego pytania i zdałem sobie sprawę, że brakuje odpowiedzi. Szkoda, a ja często zwracam uwagę na tę dokumentację NHibernate: 24. Best Practices

Nie używaj mapowania skojarzeń egzotycznych.

Dobre zastosowania dla prawdziwych stowarzyszeń wielu do wielu są rzadkością. Większość z czasu potrzebujesz dodatkowych informacji przechowywanych w "tabeli linków". W tym przypadku znacznie lepiej jest użyć dwóch jedno-do-wielu powiązań z klasą pośredniego łącza. W rzeczywistości uważamy, że większość skojarzeń to jeden-do-wielu i wiele-do-jednego, powinieneś być ostrożny przy używaniu dowolnego innego stylu skojarzeniowego i zadać sobie pytanie, czy jest to naprawdę konieczne.

Spójrz na przykład pod numerem 23.2. Author/Work. Extract, uproszczona wersja wiele do wielu relacji między Author i 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> 

i jego wiele-do-wielu docelowej 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> 

Tak więc, jeśli chcielibyśmy zamówić zestaw Prac na ładunek, mamy problem. W tabeli par nie ma kolumny. Ale co ważniejsze, nie ma sposobu, aby zarządzać taką kolumną.

Co możemy zrobić, jest wprowadzony przedmiot pary: AuthorWork i rozszerzyć tabelę Pair ile potrzeba

public class AuthorWork 
{ 

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

mapowanie 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" /> 

Mając to możemy przekonwertować Many to-many mapowanie na jeden do wielu, na przykład kolekcja autorów:

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

Możemy zarządzać jednostką AuthorWork, ustawiać kolumnę OrderBy, a tym samym efektywnie pracować z tabelą parowania.

UWAGA: należy zgodzić się z tą sugestią w dokumentacji. Im więcej wymagań się pojawia, tym bardziej cieszymy się, że mamy sposób zarządzania relacją!

+4

Informacje o poleceniach na temat najlepszych praktyk zostały przeniesione na: http://nhibernate.info/doc/nh/en/index.html#example-mappings-authorwork – mcfea

Powiązane problemy