2011-01-24 6 views
6

Вот моя иерархия:NHibernate дискриминированных Подклассы объединенного-Подкласс

 
class abstract Entity { /*members*/ } // mapped to entity table 
class abstract User : Entity { /*members*/ } // mapped to user table 

class Employee : User { /*no members*/ } // no table, discriminator = "E" 
class Contractor : User { /*no members*/ } // no table, discriminator = "C" 

Вот мои отображения в двух отдельных HBM файлов:

 
<class name="Entity" table="entity" xmlns="urn:nhibernate-mapping-2.2"> 
    <id name="Id" column="id"> 
    <generator class="guid.comb" /> 
    </id> 
    <property ... /> 
</class> 

<joined-subclass name="User" extends="Entity" table="user"> 
    <key column="id" /> 
    <discriminator column="type" /> 
    <property ... /> 
    <subclass name="Employee" discriminator-value="E" /> 
    <subclass name="Contractor" discriminator-value="C" /> 
</joined-subclass> 

Ниже исключение я получаю:

MappingException: ошибка проверки XML: элемент «объединенный подкласс» в пространстве имен «urn: nhibernate-mapping-2.2» имеет недопустимый дочерний элемент «дискриминатор» в пространстве имен «urn: nhibernate-mapping-2.2».

Что мне не хватает? Можете ли вы не сопоставить иерархию подкласса с дискриминацией объединенного подкласса?

ответ

2

Что вы хотите сделать в настоящее время невозможно.

Отметьте http://www.nhforge.org/doc/nh/en/index.html#inheritance для разрешенных конструкций.

+0

Итак, если я понимаю это право, я не могу смешивать разные стратегии наследования? В принципе, если каждый класс в конечном счете опускается из базового класса, такого как «Entity», тогда мне нужно выбрать одну стратегию, и это будет целая иерархия. Я понимаю, что не могу смешиваться на одном уровне, но есть ли шанс, что это будет поддерживаться на разных уровнях в будущем? –

+1

@Travis, есть ли причина, по которой вы хотите иметь таблицу для Entity? – Vadim

+0

Да; существует 6 полей, которые являются общими для всех моих сущностей [Id, IsActive, DateCreated, Creator, DateModified, Modifier]. Но даже если бы я не нуждался в Entity, Пользователь занял бы место в аналогичной ситуации, если мне нужно было продлить Подрядчика или Работника. –

2

объединенный подкласс не имеет дискриминатора, потому что он находится в отдельной таблице. Вот как он знает, что такое подкласс. Если вы хотите использовать дискриминатор, вы бы использовали одну таблицу для всех своих подклассов, и вы использовали бы отображение subclass

+0

объединенные подклассы могут быть определены в отдельных файлах; однако это не относится к делу. Я думаю, вы пропустили, что «отдельная таблица» является корнем новой иерархии наследования, основанной на дискриминаторе. Возможно, вы могли бы предоставить сопоставление, которое сделает что-то похожее на то, о чем я озадачен. –

+0

@Travis, интересный повторный подкласс. Однако ваше сопоставление пользователя по-прежнему должно быть подклассом, а не объединенным подклассом, поскольку оно находится в другой таблице. – Vadim