Нет , и вот почему.
Предположим, у нас есть две строки в таблице StateMachineMetadata
:
ID | State | DateChanged
1 | 1 | 2012-02-13
2 | 1 | 2012-02-14
Если столбец State
равенсопоставленный как с CarState
, так и с OrderState
, как NHibernate определит, к какому перечислению десериализоваться?Одним из решений было бы добавить столбец дискриминатора в таблицу StateMachineMetadata
, который сообщает NHibernate, с каким типом ему следует сопоставить определенную строку.
Например, столбец дискриминатора Type
:
ID | State | DateChanged | Type
1 | 1 | 2012-02-13 1
2 | 1 | 2012-02-14 2
сообщает NHibernate, что первая строка представляет StateMachineMetadata<CarState>
, а вторая - StateMachineMetadata<OrderState>
.Это называется Таблица для отображения иерархии классов в NHibernate.Это требует, чтобы оба класса наследовали от общего базового класса, который в вашем случае, естественно, будет StateMachineMetadata<T>
.
Но вот подвох : NHibernate не имеет способасопоставить класс с открытым универсальным типом .Причина в том, что это просто невозможно .
Однако NHibernate действительно позволяет отображать классы с закрытыми обобщениями.Вы просто не можете отобразить их на одну и ту же таблицу.Вот как будет выглядеть такая конфигурация:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="MyAssembly"
namespace="MyNamespace">
<class name="StateMachineMetadata`1[MyNamespace.CarState]"
table="StateMachineMetadata_CarState">
<!-- property to column mappings -->
</class>
<class name="StateMachineMetadata`1[MyNamespace.OrderState]"
table="StateMachineMetadata_OrderState">
<!-- property to column mappings -->
</class>
</hibernate-mapping>