2013-03-19 51 views
5

Tôi đã đọc một bài đăng trên internet (tôi không còn có thể tìm thấy bài đăng đó để tôi có thể tự tin) rằng mối quan hệ Nhiều-Nhiều có thể được thay thế bằng mối quan hệ một-nhiều. Ai đó có thể cung cấp một ví dụ?Nhibernate: Làm thế nào để thể hiện mối quan hệ nhiều-với-nhiều với mối quan hệ một-nhiều?

+0

Vui lòng mô tả bảng của bạn và lớp học bạn muốn sử dụng. – cremor

+3

Do các DBMS quan hệ thường không hỗ trợ các mối quan hệ nhiều-nhiều, các mối quan hệ này được biểu diễn bằng cách sử dụng một bảng liên kết và hai mối quan hệ một-nhiều. Ví dụ, một mối quan hệ nhiều-nhiều giữa 'User' và 'Role' được biểu diễn bằng 'User-to-many UserRoles Role-to-one'. NHibernate thường che giấu điều này và cho phép nhiều mối quan hệ một cách minh bạch. Nếu bạn muốn, bạn luôn có thể chọn ánh xạ bảng liên kết một cách rõ ràng, tức là. bạn muốn ánh xạ 'User',' Role' _and_ 'UserRoles', trong đó' UserRoles' chứa hai mối quan hệ nhiều-một (tương ứng với 'User' và' Role'). –

+0

(tiếp theo).Trong trường hợp này không phải 'Người dùng' cũng như' Vai trò' sẽ cần giữ các bộ sưu tập (một-nhiều) của các cá thể 'UserRoles' (hoặc ít nhất chúng có thể là nghịch đảo). Điều này có thể hữu ích để giảm bộ nhớ vì bạn cần tải ít bộ sưu tập hơn vào bộ nhớ. Nhược điểm là các truy vấn trở nên phức tạp hơn. –

Trả lời

11

Tôi chỉ nghĩ ra câu hỏi đó và nhận ra rằng không có câu trả lời nào. Và nó là một sự xấu hổ, trong khi tôi thường chỉ ra tuyên bố tài liệu NHibernate này: 24. Best Practices

Không sử dụng ánh xạ liên kết kỳ lạ.

Không thể thực hiện các yêu cầu hữu ích cho các liên kết thực tế với nhiều người. Hầu hết thời gian bạn cần thêm thông tin được lưu trữ trong "bảng liên kết". Trong trường hợp này, tốt hơn nên sử dụng hai liên kết một-nhiều với một lớp liên kết trung gian. Trong thực tế, chúng tôi nghĩ rằng hầu hết các hiệp hội là một-nhiều và nhiều người, bạn nên cẩn thận khi sử dụng bất kỳ kiểu kết hợp khác và tự hỏi mình xem nó có thực sự cần thiết hay không.

Hãy xem ví dụ dưới 23.2. Author/Work. Extract, phiên bản đơn giản hóa của mối quan hệ nhiều-nhiều giữa AuthorWork:

<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> 

Và nó nhiều-nhiều mục tiêu Tác giả:

<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> 

Vì vậy, nếu chúng ta muốn đặt hàng bộ công trình khi tải, chúng tôi có vấn đề. Không có cột nào trong bảng ghép nối. Nhưng điều quan trọng hơn, không có cách nào để quản lý một cột như vậy.

Những gì chúng ta có thể làm, là để giới thiệu đối tượng Pair: AuthorWork và mở rộng bảng Pair khi cần thiết

public class AuthorWork 
{ 

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

Mapping của 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" /> 

Có điều này chúng ta có thể chuyển đổi các many- lập bản đồ nhiều thành một-nhiều, ví dụ: bộ sưu tập Tác giả:

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

Và chúng ta có thể quản lý thực thể AuthorWork, thiết lập cột OrderBy, và do đó có hiệu quả làm việc với bảng ghép nối.

LƯU Ý: phải đồng ý với đề xuất đó trong tài liệu Các yêu cầu khác đến, chúng tôi càng hạnh phúc khi có cách quản lý quan hệ!

+4

Hướng dẫn liên kết các phương pháp hay nhất đã chuyển đến: http://nhibernate.info/doc/nh/en/index.html#example-mappings-authorwork – mcfea

Các vấn đề liên quan