Вопрос

Настоящий новичок здесь.Ищете совет о том, как отобразить следующий распространенный сценарий:

[Магазин]
идентификатор 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 может (среди прочего) автоматически сгенерировать для вас сопоставления из вашей модели домена, а также помочь вам сгенерировать схему базы данных.Это очень гибкий инструмент, который становится все лучше и лучше.Вы найдете это здесь:

Свободно владеет NHibernate

Удачи!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top