Справка по файлу сопоставления NHibernate
-
06-07-2019 - |
Вопрос
Настоящий новичок здесь.Ищете совет о том, как отобразить следующий распространенный сценарий:
[Магазин]
идентификатор pk
Имя
[Элемент запаса]
идентификатор pk
Имя
[Товарный магазин]
идентификатор pk
StockItemId фк
StoreID фк
ПарЛевый уровень
Я создал domainmodel, который позволяет назначать различные StockItems различным хранилищам с помощью объекта StockItem, используя метод AssignToStore (Хранить хранилище).
Сейчас я использую nhibernate для создания своей схемы БД.Как мне настроить файлы сопоставления для этого базового сценария?
Любые советы очень ценятся.
Чев
Решение
К сожалению, эту взаимосвязь не так-то просто смоделировать в NHibernate, и есть некоторые неотъемлемые проблемы, с которыми вы столкнетесь при попытке выполнить запросы к данным в связующей таблице, что потребует некоторых сложных обходных путей, но как только вы ее настроите, она работает довольно хорошо.
Мой подход к этому состоит в том, чтобы настроить его как два сопоставления "многие к одному" со следующим соотношением в сопоставлении магазина и обратным соотношением в сопоставлении 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 будет null.Его можно было бы разбить на два класса, но я нахожу, что с таким подходом легче работать.Это просто требует, чтобы вы, как разработчик, знали, с какой стороны вы к нему подходите, но, на мой взгляд, это хороший компромисс для упрощения кода и его повторного использования
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, дайте мне знать, и я могу опубликовать несколько примеров кода.
- Макс.
Другие советы
Я бы настоятельно рекомендовал ознакомиться с NHibernate.Вот очень хорошая отправная точка:
Часто задаваемые вопросы о NHibernate
Я бы также рекомендовал вам первые пару раз выполнить сопоставления вручную.После этого вам следует ознакомиться с Fluent NHibernate.Fluent NHibernate может (среди прочего) автоматически сгенерировать для вас сопоставления из вашей модели домена, а также помочь вам сгенерировать схему базы данных.Это очень гибкий инструмент, который становится все лучше и лучше.Вы найдете это здесь:
Удачи!