2008-11-25 13 views
5

Tôi không chắc chắn làm thế nào để đặt câu hỏi, vì tôi không biết những gì tôi không biết, và do đó tôi không biết thuật ngữ thích hợp cho những gì tôi đang cố gắng để có được câu trả lời. Tôi sẽ giải thích kịch bản của tôi, với hy vọng rằng nó sẽ giúp:Thu nhỏ bộ sưu tập tra cứu NHibernate (nếu điều đó có ý nghĩa)

Tôi có ba bảng, một bảng Sách, một bảng Thẻ và một bảng tra cứu BookTag.

Mỗi sách có ID, Tiêu đề (cho người mới bắt đầu) Mỗi thẻ có ID và mỗi tiêu đề Mỗi thẻ sách có ID, ID BookID và TagID.

Sách có thể được gắn thẻ với nhiều thẻ và thẻ có thể được sử dụng trên nhiều ID BookID.

Tôi đã có thiết lập đối tượng của tôi theo cách này:

Book.cs 
int BookID 
string Title 
List<BookTag> Tags 

Tag.cs 
int TagID 
string Title 

BookTag.cs 
int ID 
int BookID 
int TagID 

Tôi muốn lớp Books.cs để có một bộ sưu tập của Tags, và không BookTags, nhưng tôi dường như không thể có được ánh xạ đúng trong NHibernate. Đây là những gì tôi đã có cho các tập tin Book.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DomainModel" namespace="DomainModel.Books"> 
    <class name="DomainModel.Books.Book" table="Books"> 
    <id name="BookID" type="Int32" unsaved-value="0"> 
     <generator class="native"/> 
    </id> 
    <property name="Title" type="String" not-null="true"/> 
    <set lazy="true" name="Tags" table="BookTags" generic="true" inverse="true" cascade="delete"> 
     <key column="BookID"/> 
     <one-to-many class="DomainModel.Books.BookTag, DomainModel"/> 
    </set> 
    </class> 
</hibernate-mapping> 

Và đây là BookTag.hbm.xml tôi:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DomainModel" namespace="DomainModel.Books"> 
    <class name="DomainModel.Books.BookTag" table="BookTags"> 
    <id column="BookTagID" name="BookTagID" type="Int32" unsaved-value="0"> 
     <generator class="native"/> 
    </id> 
    <many-to-one name="Tag"> 
     <column not-null="true" name="TagID"/> 
    </many-to-one> 
    <many-to-one name="Book"> 
     <column not-null="true" name="BookID"/> 
    </many-to-one> 
    </class> 
</hibernate-mapping> 

Theo mô hình này, tôi có thể nhận được thẻ Tôi muốn bằng cách sử dụng mô hình đối tượng của tôi: Book.Tags [0] .Tag, nhưng điều đó dường như không hiệu quả. Tôi có thể sử dụng NHibernate để vạch ra BookTags.TagID với Tags.TagID trong cơ sở dữ liệu để tôi có thể lấy Book.Tags [0] để trả về một đối tượng Thẻ, thay vì một đối tượng BookTags không? Tôi không biết cách nào tốt hơn để liên kết Sách với thẻ để thẻ được sử dụng trên Book1 có thể được sử dụng trên Book2 mà không thêm mục nhập mới vào bảng Thẻ.

Tôi hy vọng điều này làm cho ít nhất một số ý nghĩa. Hãy cho tôi biết nếu bạn cần làm rõ thêm. Tôi sẽ đăng giải pháp của mình ở đây nếu tôi tìm ra giải pháp trước khi ai đó trả lời.

+0

nhờ cho câu hỏi này !!!!! ~ –

Trả lời

4

Bạn không cần lớp BookTag. Bạn có thể ánh xạ bộ sưu tập Book.Tags dưới dạng nhiều người. Để làm điều này, bạn sẽ chỉ định BookTag trong bản đồ để kết nối liên kết. Hãy xem here trong phần 6.8 Các Hiệp hội Hai chiều.

+1

Các liên kết bị phá vỡ. –

3

Cảm ơn bạn Tim, đó là những gì tôi cần. Đối với những người tò mò, tôi "un-ánh xạ" bảng BookTag/đối tượng, và bây giờ chỉ cần có một đối tượng Book và một đối tượng Tag được sử dụng và ánh xạ tới NHibernate.

My Book.hbm.xml đã được cập nhật như sau:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DomainModel" namespace="DomainModel.Books"> 
    <class name="DomainModel.Books.Book" table="Books"> 
    <id name="BookID" type="Int32" unsaved-value="0"> 
     <generator class="native"/> 
    </id> 
    <property name="Title" type="String" not-null="true"/> 
    <bag name="Tags" table="BookTag" generic="true"> 
     <key column="BookID" on-delete="noaction"></key> 
     <many-to-many class="Tag" column="TagID"></many-to-many> 
    </bag> 
    </class> 
</hibernate-mapping> 
Các vấn đề liên quan