2008-10-09 33 views
5

Tôi có một lớp học với mô tả sau đây:NHibernate hai chiều nhiều-nhiều hiệp hội

public class Customer { 
    public ISet<Client> Contacts { get; protected set;} 
} 

Tôi muốn để lập bản đồ hệ sở hữu lên bảng sau:

CREATE TABLE user_contacts (
    user1 uuid NOT NULL, 
    user2 uuid NOT NULL 
) 

Tôi muốn nó để ánh xạ hai chiều, tức là khi Customer1 được thêm vào Danh bạ của Khách hàng2, bộ sưu tập Danh bạ của Khách hàng1 phải chứa Khách hàng2 (có thể chỉ sau khi tải lại thực thể). Làm thế nào tôi có thể làm điều đó?

Cập nhật Chắc chắn tôi có thể ánh xạ các bộ từ trái sang phải và từ phải sang trái rồi kết hợp sau đó trong thời gian chạy, nhưng nó sẽ ... hmm ... untasty ... Có giải pháp nào khác không? Bất kỳ cách nào, cảm ơn bạn rất phù hợp, FryHard!

Trả lời

2

Hãy xem liên kết này về những gì hibernate gọi một chiều many-to-many associations. Trong Castle ActiveRecord Tôi sử dụng các liên kết HasAndBelongsToMany, nhưng tôi không chắc chắn chính xác nó được ánh xạ trong nhibernate như thế nào.

Mặc dù xem xét câu hỏi của bạn sâu hơn một chút, có vẻ như bạn sẽ liên kết hai chiều từ khách hàng đến user_contacts, điều này có thể phá vỡ liên kết nhiều người. Tôi sẽ chơi với một ví dụ và xem những gì tôi có thể nghĩ ra.

Một Export các file hbm từ ActiveRecord cho thấy ví dụ

<?xml version="1.0" encoding="utf-16"?> 
<hibernate-mapping auto-import="true" default-lazy="false" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="NHibernateMapping.Customer, NHibernateMapping" table="Customer" schema="dbo"> 
    <id name="Id" access="property" column="Id" type="Int32" unsaved-value="0"> 
     <generator class="identity"> 
     </generator> 
    </id> 
    <property name="LastName" access="property" type="String"> 
     <column name="LastName" not-null="true"/> 
    </property> 
    <bag name="ChildContacts" access="property" table="user_contacts" lazy="false"> 
     <key column="user1" /> 
     <many-to-many class="NHibernateMapping.Customer, NHibernateMapping" column="user2"/> 
    </bag> 
    <bag name="ParentContacts" access="property" table="user_contacts" lazy="false" inverse="true"> 
     <key column="user2" /> 
     <many-to-many class="NHibernateMapping.Customer, NHibernateMapping" column="user1"/> 
    </bag> 
    </class> 
</hibernate-mapping> 

ActiveRecord này:

[ActiveRecord("Customer", Schema = "dbo")] 
public class Customer 
{ 
    [PrimaryKey(PrimaryKeyType.Identity, "Id", ColumnType = "Int32")] 
    public virtual int Id { get; set; } 

    [Property("LastName", ColumnType = "String", NotNull = true)] 
    public virtual string LastName { get; set; } 

    [HasAndBelongsToMany(typeof(Customer), Table = "user_contacts", ColumnKey = "user1", ColumnRef = "user2")] 
    public IList<Customer> ChildContacts { get; set; } 

    [HasAndBelongsToMany(typeof(Customer), Table = "user_contacts", ColumnKey = "user2", ColumnRef = "user1", Inverse = true)] 
    public IList<Customer> ParentContacts { get; set; } 
} 

Hy vọng nó sẽ giúp!

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