Полиморфные NHibernate отображения - PullRequest
2 голосов
/ 20 апреля 2010

У меня есть интерфейс IUserLocation и конкретный тип UserLocation.

Когда я использую ICriteria, указав интерфейс IUserLocation, я хочу, чтобы NHibernate создавал коллекцию типа concrete UserLocation.

Я создал файл отображения HBM, используя таблицу для стратегии конкретного типа (показано ниже). Однако, когда я запрашиваю NHibernate, используя ICriteria, я получаю:

NHibernate не может создать экземпляр абстрактного класса или интерфейса MyNamespace.IUserLocation

Кто-нибудь может понять, почему это так? (исходный код для соответствующего бита NHibernate здесь (я думаю))

Мои критерии:

var filter = DetachedCriteria.For<IUserLocation>()
                             .Add(Restrictions.Eq("UserId", userId));

return filter.GetExecutableCriteria(UoW.Session)
             .List<IUserLocation>();

Мой файл сопоставления:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="true">
  <class xmlns="urn:nhibernate-mapping-2.2" name="MyNamespace.IUserLocation,MyAssembly" abstract="true" table="IUserLocations">
    <composite-id>
      <key-property name="UserId" column="UserId" type="System.Guid"></key-property>
      <key-many-to-one name="Location" column="LocationId" class="MyNamespace.ILocation,MyAssembly"></key-many-to-one>
    </composite-id>
    <union-subclass table="UserLocations" name="MyNamespace2.UserLocation,MyAssembly2">
      <property name="IsAdmin" />
    </union-subclass>    
  </class>  
</hibernate-mapping>

1 Ответ

3 голосов
/ 20 апреля 2010

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

Я использовал Таблица для каждого конкретного класса, используя неявный полиморфизм ранее с отдельным отображением для каждого подкласса.

<class name="MyNamespace.UserLocation,MyAssembly" table="UserLocations">
    ...
</class>
...