我的地图上有一个类库,它继承了两个新类
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Business" namespace="Business.Test">
<class name="BaseExample" table="base_example" abstract="true" discriminator-value="0">
<id name="Id" column="id" type="Int64" unsaved-value="0">
<generator class="native"/>
</id>
<discriminator column="domain" type="Int16" not-null="true" force="true" />
....
....
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Business" namespace="Business.Test">
<subclass name="Example1" extends="BaseExample" discriminator-value="1">
....
....
</subclass>
</hibernate-mapping>
一切正常,但如果我要求那个领域,例如:
var Clients = ClientFactory.GetAll().Where(c => c.UserData.BaseExample.Domain == 1);
抛出此异常:异常消息:无法解析属性:域名:Business.Entities.BaseExample
怎么知道它是一类还是另一类?
答案 0 :(得分:8)
鉴别器应该在NHibernate的幕后使用(参见Rippo的例子)。我们的想法是你查询类,并从该类的映射中注入适当的鉴别器。
但是,如果由于某种原因您需要在属性中使用该信息,则将其作为属性包含在内是有效的。这意味着
<class name="BaseExample" table="base_example" abstract="true" discriminator-value="0">
<id name="Id" column="id" type="Int64" unsaved-value="0">
<generator class="native"/>
</id>
<discriminator column="domain" type="Int16" not-null="true" force="true" />
<property name="domain" column="domain" type="Int16" update="false" insert="false" />
....
....
</class>
将属性声明为readonly(update="false" insert="false"
)非常重要,因为这是一个完全由nhibernate管理的列。
答案 1 :(得分:1)
使用QueryOver
获取课程base_example
的{{1}}表格中的所有记录,您可以这样做: -
BaseExample
获取您将执行此操作的所有session.QueryOver<BaseExample>().List();
条记录
Example1
获取所有session.QueryOver<Example1>().List();
条记录: -
Example2
换句话说,NHibernate足够聪明,可以自动在查询中添加where子句session.QueryOver<Example2>().List();
或Domain=1
。
还应该注意的是,如果你想要基表中的所有记录并有一个循环,那么你可以这样做: -
Domain=2