【问题标题】:Polymorphic NHibernate mappings多态 NHibernate 映射
【发布时间】:2010-04-19 20:37:05
【问题描述】:

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

当我使用 ICriteria 时,指定 interface IUserLocation,我希望 NHibernate 实例化 concrete 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>

【问题讨论】:

    标签: nhibernate nhibernate-mapping interface


    【解决方案1】:

    从文档看来,您的映射文件应该对我执行此操作。不过,我从未尝试过每个具体班级的表格。我注意到NHibernate documentation 中的示例,因为它不使用基类的接口。可能不支持?

    我之前使用过Table per concrete class, using implicit polymorphism,每个子类都有一个单独的映射。

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

    【讨论】:

    • 谢谢大卫。我突然想到我可能是在叫错树,因为我在这里尝试使用 NHibernate 有点像 IOC 容器,实例化一个我只提供接口的具体类型。如果 NHibernate 支持这一点,我认为它会非常有用。由于我正在使用的解决方案的限制,将接口修改为抽象基类是不切实际的。作为一个临时 hack,我正在使用 IOC 容器来解析接口的具体类型以提供给 ICriteria。
    • 我再次开始查看这个,我注意到如果映射文件使用 UserLocation 而不是 IUserLocation 并且联合子类被删除,您仍然可以在条件中将其作为 IUserLocation 引用并取回 IList.
    猜你喜欢
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    相关资源
    最近更新 更多