2008-10-09 19 views
5

Mam klasy z następującym opisem:NHibernate dwukierunkowy wiele-do-wielu stowarzyszenie

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

Chcę map Kontakt nieruchomość na poniższej tabeli:

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

chcę mapować dwukierunkowo, tj. gdy Klient1 został dodany do Kontaktów Klienta2, kolekcja Kontakty Customer1 powinna zawierać Klient2 (być może dopiero po przeładowaniu podmiotu). Jak mogłem to zrobić?

Aktualizacja Pewnie, że może odwzorowywać od lewej do prawej i od prawej zestawów do lewej, a następnie połączyć następnie w czasie wykonywania, ale to będzie ... hmm ... niesmaczne ... Czy istnieje inne rozwiązanie? Każdy sposób, dziękuję bardzo pasuje, FryHard!

Odpowiedz

2

Zobacz ten link na temat połączeń hibernacji jednokierunkowych many-to-many associations. W Castle ActiveRecord używam linków HasAndBelongsToMany, ale nie jestem pewien, jak dokładnie jest on mapowany w nhibernate.

Chociaż spojrzenie na twoje pytanie jest nieco głębsze, wygląda na to, że będziesz łączyć dwukierunkowo od klienta do user_contacts, co może przerwać link wiele-wiele. Będę grał z przykładem i zobaczę, co mogę wymyślić.

wywozowy pliki HBM z ActiveRecord pokazuje ten przykład

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

[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; } 
} 

Nadzieję, że to pomaga!

Powiązane problemy