К сожалению, это не самая простая модель для моделирования в nHibernate, и есть некоторые присущие вам проблемы, с которыми вы столкнетесь при попытке выполнить запросы к данным в таблице ссылок, что потребует некоторых сложных обходных путей, но как только вы их получите настроить это работает довольно хорошо.
Мой подход к этому состоит в том, чтобы настроить его как два сопоставления "многие к одному" со следующим соотношением в сопоставлении Store и обратным отношением в сопоставлении StockItem.
<bag name="StockItems" table="StockItemStore" lazy="true">
<key column="StoreId" />
<composite-element class="SuperStore.Components.StockItemStore, SuperStore.Components">
<property name="ParLevel" type="Int32" />
<many-to-one name="StockItem" column="StockItemId" class="SuperStore.Components.StockItem, SuperStore.Components" fetch="join" cascade="all" />
</composite-element>
</bag>
Класс Store будет иметь следующую коллекцию:
public virtual IList< StockItemStore > StockItems {get;set;}
и StockItem снова будет иметь обратное значение:
public virtual IList< StockItemStore > Stores {get;set;}
Объект StockItemStore может содержать любой объект (Store или StockItem) и любую дополнительную информацию, содержащуюся в таблице ссылок. (в данном случае только ParLevel.
в зависимости от того, с какой стороны вы смотрите на объект StockItemStore из Store или StockItem, будет нулевым. Его можно разбить на два класса, но с этим подходом мне легче работать. Вам, как разработчику, просто необходимо знать, с какой стороны вы к нему подходите, но, на мой взгляд, это хороший компромисс для упрощения и повторного использования кода
public class StockItemStore
{
private StockItem stockItem;
private Store store;
public virtual StockItem StockItem
{
get
{
if (stockItem == null)
{
stockItem = new StockItem();
}
return stockItem;
}
set
{
stockItem = value;
}
}
public virtual Store store
{
get
{
if (store == null)
{
store = new Store();
}
return store;
}
set
{
store = value;
}
}
public virtual int ParLevel { get; set; }
}
Мой подход не использует единственный уникальный идентификатор в StockItemStore, как вы определили в своем вопросе, а скорее то, что составляет составной ключ в таблице ссылок. Но это хорошо послужило мне в прошлом. Я уверен, что вы могли бы как-то использовать этот идентификатор, если он вам действительно нужен.
Этот подход отлично подходит для запросов с использованием HQL. если вы пытаетесь использовать запросы ICriteria, это может привести к некоторой шаткости. Существуют некоторые решения с использованием представлений базы данных для имитации другой таблицы, которые используются для запросов, которые сработали для меня.
Если вам нужно выполнить запросы ICriteria, дайте мне знать, и я могу опубликовать пример кода.