參考Ayende的帖子在這裏: http://ayende.com/blog/3941/nhibernate-mapping-inheritance如何使用NHibernate聯合子類映射抽象屬性?
我有一個可以通過擴展上述職位的工會子類映射位,通過增加一個抽象的名稱屬性黨達成了類似的情況。該模型將如下:
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();
查詢不匹配,在所有的人,但是從公司的工會子類使用的映射。因此,當使用Party進行參數化時,查詢似乎基本上與使用Company進行參數化時相同(查詢的WHERE子句是:WHERE this_.company_name =((E'firstname lastname'):: text))
任何關於我可能會出錯的指針以及如何實現我所追求的內容?
我嘗試了這種方法,但不幸的是行爲保持不變。當嘗試在覆蓋屬性上使用屬性訪問時,向抽象名稱(在覆蓋時需要)添加setter,以及在不使用setter時僅覆蓋getter時使用後臺字段訪問字段。 – proge