使用nhibernate hbm映射继承的类

使用nhibernate hbm映射继承的类,nhibernate,mapping,subclass,hbm,Nhibernate,Mapping,Subclass,Hbm,我在同一张桌子上有两个班 一个类“实体”包含表实体的属性x、y、z 派生类“ExtendedEntity”包含更多属性(集合-与其他表的关系) 我想映射这两个对象,但是如果不使用鉴别器,我找不到映射子类的方法(我不需要鉴别器,有时我想选择实体对象,有时选择ExtendedEntity)。 有人知道吗? (我试图通过复制实体映射并添加新属性来映射ExtendedEntity,但现在当我想要获取实体对象时,它会为我带来ExtendedEntity) 谢谢 考虑到你问题的第一句话: 我在同一张桌子上有

我在同一张桌子上有两个班

一个类“实体”包含表实体的属性x、y、z 派生类“ExtendedEntity”包含更多属性(集合-与其他表的关系)

我想映射这两个对象,但是如果不使用鉴别器,我找不到映射子类的方法(我不需要鉴别器,有时我想选择实体对象,有时选择ExtendedEntity)。 有人知道吗? (我试图通过复制实体映射并添加新属性来映射ExtendedEntity,但现在当我想要获取实体对象时,它会为我带来ExtendedEntity)


谢谢

考虑到你问题的第一句话:

我在同一张桌子上有两个班

这意味着只有一个表(“实体”)。如果这是真的,那么如果不存在鉴别器,则不必存在,甚至不应该存在任何继承。如果两个实体都与所有行相关,那么(而不是继承)我们需要惰性。只有一个
实体
从原生NHibernate行为中获益:具有惰性属性。而且,为了优化某些查询,可以使用预测

但是,我的建议只有在我正确理解您的场景时才是正确的:引入这两个实体只是为了减少工作量;但两者都以一个表中的所有行为目标

唯一类的映射

<class name="Entity" table="ENTITY" lazy="true">
<id name="ID" column="Entityd">
  <generator class="native"></generator>
</id>

<!-- standard default always loaded  properties --> 
<property name="Code" />
<property name="Name" />

<!-- only if accessed, lazily loaded properties --> 
<many-to-one  lazy="proxy" name="Currency" column="CurrencyId" cascade="none" />
<property     lazy="true"  name="Image" column="ImageBinary"  />
...
我们甚至可以通过预测来减少它

var propertyList = NHibernate.Criterion.Projections.ProjectionList();
// projection properties
propertyList.Add(NHibernate.Criterion.Projections.Property("ID"));
propertyList.Add(NHibernate.Criterion.Projections.Property("Code"));

var projected = session.CreateCriteria<Entity>()
.SetMaxResults(5)
.SetProjection(propertyList)
.SetResultTransformer(new NHibernate.Transform
                      .AliasToBeanResultTransformer(typeof(Entity)))
.List<Entity>();
所以,如果我没有看错您的问题,在您的场景中,解决方案不是继承,而是NHibernate固有的惰性

注意:即使在这种情况下,也可能存在从实体派生的ExtendedEntity。但不是通过NHibernate映射进行继承,而是用于投影变换。从多个属性到一个属性的一些属性可以这样投影

SELECT TOP 5  this_.EntityId as EntityId3_1_
, this_.Code as Code3_1_
, this_.Name as Name3_1_
FROM ENTITY this_ 
var propertyList = NHibernate.Criterion.Projections.ProjectionList();
// projection properties
propertyList.Add(NHibernate.Criterion.Projections.Property("ID"));
propertyList.Add(NHibernate.Criterion.Projections.Property("Code"));

var projected = session.CreateCriteria<Entity>()
.SetMaxResults(5)
.SetProjection(propertyList)
.SetResultTransformer(new NHibernate.Transform
                      .AliasToBeanResultTransformer(typeof(Entity)))
.List<Entity>();
SELECT TOP 5 this_.Code as y0_
, this_.EntityId as y1_ 
FROM ENTITY this_