Nhibernate один-ко-многим с таблицей на подкласс - PullRequest
0 голосов
/ 09 апреля 2010

Я настраиваю структуру базы данных N2CMS и столкнулся с проблемой. Два класса перечислены ниже.

public class Customer : ContentItem
{
  public IList<License> Licenses { get; set; }
}

public class License : ContentItem
{
  public Customer Customer { get; set; }
}

Отображение nhibernate выглядит следующим образом.

  <class name="N2.ContentItem,N2" table="n2item">
    <cache usage="read-write" />
    <id name="ID" column="ID" type="Int32" unsaved-value="0" access="property">
      <generator class="native" />
    </id>
    <discriminator column="Type" type="String" />
  </class>

  <subclass name="My.Customer,My" extends="N2.ContentItem,N2" discriminator-value="Customer">
    <join table="Customer">
      <key column="ItemID" />
      <bag name="Licenses" generic="true" inverse="true">
        <key column="CustomerID" />
        <one-to-many class="My.License,My"/>
      </bag>
    </join>
  </subclass>

  <subclass name="My.License,My" extends="N2.ContentItem,N2" discriminator-value="License">
    <join table="License" fetch="select">
      <key column="ItemID" />
      <many-to-one name="Customer" column="CustomerID"  class="My.Customer,My" not-null="false" />
    </join>
  </subclass>

Затем, когда получают экземпляр Customer, customer.Licenses всегда пуст, но на самом деле есть лицензии в базе данных для клиента. Когда я проверяю файл журнала nhibernate, я обнаруживаю, что запрос SQL выглядит так:

SELECT   licenses0_.CustomerID     as CustomerID1_,
         licenses0_.ID             as ID1_,
         licenses0_.ID             as ID2_0_,
         licenses0_1_.CustomerID   as CustomerID7_0_,
FROM     n2item licenses0_
         inner join License licenses0_1_
           on licenses0_.ID = licenses0_1_.ItemID
WHERE    licenses0_.CustomerID = 12 /* @p0 */

Кажется, что nhibernate считает, что CustomerID находится в таблице 'n2item'. Я не знаю почему, но чтобы заставить его работать, я думаю, что SQL должен быть примерно таким.

SELECT   licenses0_.ID             as ID1_,
         licenses0_.ID             as ID2_0_,
         licenses0_1_.CustomerID   as CustomerID7_0_,
FROM     n2item licenses0_
         inner join License licenses0_1_
           on licenses0_.ID = licenses0_1_.ItemID
WHERE    licenses0_1_.CustomerID = 12 /* @p0 */

Может ли кто-нибудь указать, что не так с моими отображениями? И как я могу получить правильные лицензии одного клиента? Заранее спасибо.

1 Ответ

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

Я не уверен, является ли SQL неправильным, потому что отображение родительского класса использует дискриминатор, поэтому я ожидаю, что все свойства будут храниться в той же таблице, что и базовый класс (n2item). Однако я не знаком с синтаксисом «таблицы соединений», обычно я использую объединенный подкласс, поэтому я могу неправильно понять.

Если сопоставление подкласса правильное, может ли проблема с лицензиями быть связана с тем, что для этой коллекции не задан параметр Cascade?

...