试图在NHibernate中访问一个类型的鉴别器字段

时间:2012-03-02 06:09:22

标签: .net nhibernate orm nhibernate-mapping

我的地图上有一个类库,它继承了两个新类

<?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

怎么知道它是一类还是另一类?

2 个答案:

答案 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