2008-10-09 16 views
5

tengo una clase con siguiente descripción:NHibernate bidireccional muchos-a-muchos asociación

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

Quiero mapa Contacto de la propiedad en la siguiente tabla:

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

lo quiero para asignar de forma bidireccional, es decir, cuando Customer1 se agrega a los contactos de Customer2, la colección Contacts1 de Customer1 debe contener Customer2 (tal vez solo después de la recarga de la entidad). ¿Cómo podría hacer eso?

Actualización Claro que puedo mapear conjuntos de izquierda a derecha y de derecha a izquierda y luego combinarlos en tiempo de ejecución, pero será ... hmm ... desagradable ... ¿Hay alguna otra solución? De cualquier manera, gracias muy partido, FryHard!

Respuesta

2

Eche un vistazo a este enlace en lo que hiberna llama unidireccional many-to-many associations. En Castle ActiveRecord hago uso de los enlaces HasAndBelongsToMany, pero no estoy seguro de cómo se correlaciona exactamente en nhibernate.

Aunque al mirar su pregunta un poco más profundo, parece que va a vincular bidireccionalmente de cliente a usuario_contactos, lo que podría romper el enlace de muchos. Jugaré con un ejemplo y veré qué puedo hacer.

una exportación de los archivos de HBM ActiveRecord muestra este ejemplo

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

Espero que ayude!

Cuestiones relacionadas