参考Ayende的帖子: http://ayende.com/blog/3941/nhibernate-mapping-inheritance
通过向Party添加一个抽象的Name-property,我可以通过扩展上面帖子的union-subclass映射来达到类似的情况。该模型如下:
public abstract class Party
{
public abstract string Name { get; }
}
public class Person : Party
{
public override string Name { get { return this.FirstName + " " + this.LastName; } }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
}
public class Company : Party
{
public override string Name { get { return this.CompanyName; } }
public virtual string CompanyName { get; set; }
}
我正在寻找一个允许我以下列方式查询各方的映射:
session.QueryOver<Party>().Where(p => p.Name.IsLike("firstname lastname")).List();
我正在使用的映射:
<class name="Party" table="`party`" abstract="true">
<id access="backfield" name="Id">
<column name="Id" />
<generator class="sequence">
<param name="sequence">party_id_seq</param>
</generator>
</id>
<union-subclass name="Person" table="`person`">
<property name="Name" formula="first_name || ' ' || last_name" update="false" insert="false" access="readonly">
</property>
<property name="FirstName">
<column name="first_name" />
</property>
<property name="LastName">
<column name="last_name" />
</property>
</union-subclass>
<union-subclass name="Company" table="`company`">
<property name="Name" access="readonly" update="false" insert="false">
<column name="company_name" />
</property>
<property name="CompanyName">
<column name="company_name" />
</property>
</union-subclass>
对于两者
session.QueryOver<Person>().Where(p => p.Name.IsLike("firstname lastname")).List();
和
session.QueryOver<Company>().Where(p => p.Name.IsLike("companyName")).List();
这表现得如我所料,我可以查询名称并获得匹配结果。但是,当我做的时候
session.QueryOver<Party>().Where(p => p.Name.IsLike("firstname lastname")).List();
查询根本不符合人员,但使用公司的union-subclass中的映射。因此,当使用Party进行参数化时,查询似乎与使用Company进行参数化时基本相同(查询的WHERE子句是:WHERE this_.company_name =((E'firstname lastname'):: text))
关于我可能出错的地方以及如何实现我的目标的任何指示?
答案 0 :(得分:0)
这是因为你在属性中使用逻辑,NHibernate无法确定。由于您已经为Name字段定义了公式,因此最好将它们保留为标准属性。因此,如果您按如下方式更正实体,则应该可以正常工作
public abstract class Party
{
public abstract string Name { get; }
}
public class Person : Party
{
public virtual string Name { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
}
public class Company : Party
{
public virtual string Name { get; set; }
public virtual string CompanyName { get; set; }
}
答案 1 :(得分:0)
显然这是NHibernate 3.x的一个已知问题: https://nhibernate.jira.com/browse/NH-2354?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel