NHibernate двунаправленная ассоциация "многие ко многим" - PullRequest
5 голосов
/ 09 октября 2008

У меня есть класс со следующим описанием:

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

Я хочу сопоставить контакты в следующую таблицу:

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

Я хочу, чтобы он отображался в двух направлениях, т. Е. Когда Customer1 добавлен в Контакты Customer2, коллекция контактов Customer1 должна содержать Customer2 (возможно, только после перезагрузки объекта). Как я мог это сделать?

Обновление Конечно, я могу отобразить наборы слева направо и справа налево, а затем объединить их во время выполнения, но это будет ... хм ... непривлекательно ... Есть ли другое решение? В любом случае, большое спасибо, FryHard !

1 Ответ

2 голосов
/ 09 октября 2008

Посмотрите на эту ссылку на то, что hibernate называет однонаправленными ассоциациями многие-ко-многим . В Castle ActiveRecord я использую ссылки HasAndBelongsToMany, но я не уверен, как именно они отображаются в nhibernate.

Хотя, глядя на ваш вопрос немного глубже, похоже, вы будете ссылаться двунаправленно от клиента к user_contacts, что может привести к разрыву ссылки многие-многие. Я буду играть на примере и посмотрю, что я могу придумать.

Экспорт файлов hbm из ActiveRecord показывает это

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

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...