NHibernate один в один - странные соединения? - PullRequest
0 голосов
/ 17 марта 2011

У меня проблемы с сопоставлением NHibernate один к одному. Я использую Fluent Nhibernate, и мои сопоставления основаны на этом сообщении в блоге: http://brunoreis.com/tech/fluent-nhibernate-hasone-how-implement-one-to-one-relationship/

Фрагмент таблицы:

dbo.Store
---------
Id : int

dbo.CheckoutSettings
---------
StoreId :int (FK to dbo.Store.Id)

Вот несколько БММ:

  <class xmlns="urn:nhibernate-mapping-2.2" schema="Management" mutable="true" name="Store" table="Streo">
    <id name="Id" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" unsaved-value="0">
      <column name="Id" />
      <generator class="native" />
    </id>
<one-to-one cascade="all" class="CheckoutSettings" constrained="false" name="CheckoutSettings" /> 
  </class>

  <class xmlns="urn:nhibernate-mapping-2.2" schema="Management" mutable="true" name="CheckoutSettings" table="CheckoutSettings">
    <id name="StoreId" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="StoreId" />
      <generator class="foreign">
        <param name="property">Store</param>
      </generator>
    </id>
    <one-to-one class="Store" foreign-key="FK_CheckoutSettings_StoreId" name="Store" />
</class>

Кажется, что все работает локально, но на нашем тестовом сервере я сохраняю ошибки, такие как неожиданное количество строк: 0 (ожидаемое: 1). Также во время загрузки я вижу странные соединения SQL:

select  (columns)
from    checkoutsettings c0
  left outer join store s on keys
  left outer join checkoutsettings c1 on keys
where c0.Storeid = id 

И это ничего не возвращает, так как в настройках оформления заказа может не быть строки для магазина.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 13 августа 2012

После дальнейшего изучения мы обнаружили, что у нас есть триггеры, которые делают странные вещи при вставке и обновлении. Как только мы поняли это, мы смогли внести изменения, которые решили проблему.

0 голосов
/ 20 марта 2011

Вы должны сопоставить отношение из CheckoutSettings в Store как многие-к-одному с уникальным значением true:

<many-to-one class="Store" name="Store" unique="true" column="StoreId" />

Из магазина в CheckoutSettings используйте один-к-одному со свойством ref:

<one-to-one cascade="all" class="CheckoutSettings" constrained="false" property-ref="Store" name="CheckoutSettings" />

Следует также отметить, что, поскольку свойство CheckoutSettings в сущности Store может иметь значение null, NHibernate генерирует соединение с таблицей CheckoutSettings при извлечении магазина.Это потому, что NHibernate должен знать, есть ли CheckoutSettings для извлеченного хранилища в базе данных, чтобы он мог установить свойство CheckoutSettings-null, если его нет.

...