Справка по файлу сопоставления NHibernate - PullRequest
0 голосов
/ 06 мая 2009

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

[магазин]
id pk
Имя

[StockItem]
id pk
Имя

[StockItemStore]
id pk
StockItemId fk
StoreId fk
ParLevel

Я создал модель домена, которая позволяет различным StockItems присваиваться различным магазинам через объект StockItem с использованием метода AssignToStore (Store store).

Я сейчас использую nhibernate для создания моей схемы БД. Как настроить файлы сопоставления для этого базового сценария?

Любые советы с благодарностью.

Чев

Ответы [ 2 ]

1 голос
/ 06 мая 2009

К сожалению, это не самая простая модель для моделирования в 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, дайте мне знать, и я могу опубликовать пример кода.

  • Макс
1 голос
/ 06 мая 2009

Я бы настоятельно рекомендовал почитать на nHibernate. Вот очень хорошая отправная точка:

FAQ по nHibernate

Я бы также порекомендовал вам сделать сопоставления вручную первые пару раз. После этого вы должны проверить Fluent nHibernate. Fluent nHibernate может (помимо прочего) автоматически генерировать сопоставления для вас из вашей доменной модели, а также помогает вам создавать схему базы данных. Это очень гибкий инструмент, который становится все лучше и лучше. Вы найдете это здесь:

Свободный nHibernate

Удачи!

...