我有一个接口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>
答案 0 :(得分:3)
从文档中看起来你的映射文件应该对我这么做。我从来没有尝试过每个具体课程。我注意到NHibernate documentation中的示例没有使用基类的接口。也许它不受支持?
之前我使用Table per concrete class, using implicit polymorphism为每个子类分别进行了映射。
<class name="MyNamespace.UserLocation,MyAssembly" table="UserLocations">
...
</class>