2010-04-09 3 views
0

Я настраиваю структуру базы данных N2CMS и встречаюсь с проблемой. Ниже перечислены два класса.Nhibernate one-to-many со столом для каждого подкласса

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.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 */ 

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

ответ

0

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

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

+0

С уважением, Мейсон, я думаю, возможно, мне нужно придерживаться встроенной базы данных n2, поскольку у настроенного есть так много проблем. – wenqiang

+0

Отображение подкласса - все в порядке. Я добавил элемент «один ко многим». И я попробовал почти все свойства элементов «один ко многим» и «мешок». Ничего не работает. – wenqiang

 Смежные вопросы

  • Нет связанных вопросов^_^