多态NHibernate映射

时间:2010-04-19 20:37:05

标签: nhibernate nhibernate-mapping interface

我有一个接口IUserLocation和一个具体类型UserLocation

当我使用ICriteria,指定接口 IUserLocation时,我希望NHibernate实例化具体 UserLocation类型的集合。

我使用table per concrete type策略创建了一个HBM映射文件(如下所示)。但是,当我使用ICriteria查询NHibernate时,我得到:

  

NHibernate无法实例化抽象类或接口MyNamespace.IUserLocation

谁能明白为什么会这样? (NHibernate相关位的源代码here(我认为))

我的ICriteria:

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 个答案:

答案 0 :(得分:3)

从文档中看起来你的映射文件应该对我这么做。我从来没有尝试过每个具体课程。我注意到NHibernate documentation中的示例没有使用基类的接口。也许它不受支持?

之前我使用Table per concrete class, using implicit polymorphism为每个子类分别进行了映射。

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