много-ко-многим дискриминатор таблицы соединений? - PullRequest
1 голос
/ 17 июня 2010

Я пытаюсь связать созданный мной объект Communication, который имеет 2 свойства «SuccessRecipientList» и «FailRecipientList», с помощью объекта «Users» через объединение таблицы «Communication_Recipients».Я хотел бы сделать это, используя дискриминатор в присоединяемой таблице вместо создания фактического доменного объекта для него (используя столбец бит HasFailed в соединительной таблице) Кто-нибудь знает, можно ли это сделать?

СвязьHBM:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DataLogic" namespace="DataLogic.Domain">
  <class name="DataLogic.Domain.Communication, DataLogic" table="Communications" >
    <id name="Id" column="Id" type="Int32" unsaved-value="0">
      <generator class="identity"></generator>
    </id>
    ...
    <set name="SuccessRecipientList" table="Communication_Recipients" lazy="true">
      <key column="Communication_ID"></key>
      <many-to-many class="MilkroundOnline.OnlineApplications.DataLogic.Domain.User, MilkroundOnline.OnlineApplications.DataLogic" column="User_ID"></many-to-many>
    </set>
    <set name="FailedRecipientList" table="Communication_Recipients" lazy="true" where="" >
      <key column="Communication_ID"></key>      
      <many-to-many class="MilkroundOnline.OnlineApplications.DataLogic.Domain.User, MilkroundOnline.OnlineApplications.DataLogic" column="User_ID"></many-to-many>
    </set>
  </class>
</hibernate-mapping>

DB выглядит следующим образом:

Таблица связи

ID,
Тема,
Тело

Таблица пользователей

ID,
Имя,
Фамилия

Таблица CommunicationUser

CommunicationId,
UserId,
HasFailed (Бит)

Заранее спасибо за любую помощь!
Роб

1 Ответ

2 голосов
/ 17 июня 2010

Нет, таблица «многие ко многим» может отображать только ключи (плюс индекс или ключ карты, если это список или словарь, и собственный идентификатор, если это idbag).

Вам нужно будет создать сущность. Однако из вашей объектной модели вы можете проецировать оба набора:

//mapped set
public virtual ICollection<CommunicationUser> RecipientList { get; set; }

public virtual IEnumerable<User> SuccessRecipientList
{
    get { return from cu in RecipientList where !cu.HasFailed select cu.User; }
}

public virtual IEnumerable<User> FailedRecipientList
{
    get { return from cu in RecipientList where cu.HasFailed select cu.User; }
}
...