我有同一张桌子的两个班级。
一个类“Entity”包含来自表 ENTITY 和派生类的属性 x、y、z,“ExtendedEntity”包含更多属性(集合 - 与其他表的关系)。
我想映射它们,但我找不到不使用鉴别器来映射子类的方法(我不需要鉴别器,有时我想选择实体对象,有时是扩展实体)。有人知道吗?(我试图通过复制实体映射并添加新属性来映射扩展实体,但现在当我想要获取实体对象时,它给我带来了扩展实体)。
谢谢!
我有同一张桌子的两个班级。
一个类“Entity”包含来自表 ENTITY 和派生类的属性 x、y、z,“ExtendedEntity”包含更多属性(集合 - 与其他表的关系)。
我想映射它们,但我找不到不使用鉴别器来映射子类的方法(我不需要鉴别器,有时我想选择实体对象,有时是扩展实体)。有人知道吗?(我试图通过复制实体映射并添加新属性来映射扩展实体,但现在当我想要获取实体对象时,它给我带来了扩展实体)。
谢谢!
考虑到你问题的第一句话:
我有同一张桌子的两个班级。
这意味着只有一张表("ENTITY")。如果这是真的,那么如果不存在鉴别器,则不必,甚至不应该有任何继承。如果两个实体都与所有行相关,那么(而不是继承)我们需要惰性。只有一个Entity
受益于原生 NHibernate 行为:具有惰性属性。更重要的是,为了优化一些查询 -可以使用Projections 。
但同样,只有当我正确理解您的场景时,我的建议才可能是正确的:引入这两个实体只是为了减少工作量;但两者都针对一个表中的所有行。
唯一类的映射
<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" />
...
有了这个映射,我们可以得到前 5 个实体
var list = session.CreateCriteria<Entity>()
.SetMaxResults(5)
.List<Entity>();
生成的 SQL 语句将是:
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>();
在这种情况下,SQL Select 就更小了。如果ID
andCode
就足够了..
SELECT TOP 5 this_.Code as y0_
, this_.EntityId as y1_
FROM ENTITY this_
因此,如果我正确阅读了您的问题,在您的方案中,解决方案将不是继承,而是 NHibernate 本机懒惰
注意:即使在这种情况下,也可能有从 Entity 派生的 ExtendedEntity。但不是用于通过 NHibernate 映射继承,而是用于 Projections Transformation。可以通过这种方式投影来自多对一属性的某些属性...