NHibernate Уникальное ограничение на имя и родительский объект не удается, потому что NH вставляет ноль - PullRequest
0 голосов
/ 22 апреля 2010

У меня есть объект следующим образом

Public Class Bin

  Public Property Id As Integer

  Public Property Name As String

  Public Property Store As Store

End Class

Public Class Store

    Public Property Id As Integer

    Public Property Bins As IEnumerable(Of Bin)

End Class

У меня есть уникальное ограничение в базе данных на Bin.Name и BinStoreID для обеспечения уникальных имен в магазинах. Однако, когда NHibernate сохраняет хранилище, он сначала вставляет записи Bin с нулевым StoreID, а затем выполняет обновление для установки правильного StoreID. Это нарушает уникальный ключ, если я сохраняю два хранилища с корзиной с одинаковым именем, поскольку столбцы имени одинаковы, а идентификатор StoreID для обоих равен нулю.

Есть ли что-то, что я могу добавить в сопоставление, чтобы убедиться, что правильный идентификатор StoreID включен в INSERT, а не выполнять обновление позже? Мы используем создание идентификаторов HiLo, поэтому мы не полагаемся на сгенерированные БД столбцы идентификаторов

EDIT: Информация о сопоставлении магазина для типа корзины -

<many-to-one class="NHS.EDC.SM.Data.Entities.Store, EDCBusinessLogic.SM, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="Store">
  <column name="StoreID" unique-key="UniqueBinKey" />
</many-to-one>

А для бункеров в магазине стоит

<set access="nosetter.camelcase-underscore" cascade="all-delete-orphan" inverse="true" name="Bins" mutable="true">
  <key>
    <column name="StoreID" />
  </key>
  <one-to-many class="NHS.EDC.SM.Data.Entities.Bin, EDCBusinessLogic.SM, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</set>

Спасибо

Джеймс

Ответы [ 2 ]

1 голос
/ 22 апреля 2010

Необходимо сопоставить коллекцию Bins как обратную и каскадную, и всегда устанавливать обе стороны отношения (добавить в коллекцию и установить Bin.Store.

. Это описано в 6.4Ассоциации «один ко многим» и 6.8. Двунаправленные ассоциации

0 голосов
/ 22 апреля 2010

Пожалуйста, покажите код, который сохраняет объект Bin. Если вы делаете это в следующем порядке:

session.Save(myBin);
bin.Store = myStore;
session.Flush();

NHibernate сгенерирует вставку, используя состояние объекта во время вызова Save и обновление при вызове Flush. Установка свойства Store перед сбросом сеанса исправит это.

...