2012-10-06 103 views
3

參考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))

任何關於我可能會出錯的指針以及如何實現我所追求的內容?

回答

0

這將是因爲你使用了NHibernate無法確定的屬性內部的邏輯。由於您已經爲名稱字段定義了公式,因此最好將它們保留爲標準屬性。所以,如果你糾正實體如下,它應該工作

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; } 
} 
+0

我嘗試了這種方法,但不幸的是行爲保持不變。當嘗試在覆蓋屬性上使用屬性訪問時,向抽象名稱(在覆蓋時需要)添加setter,以及在不使用setter時僅覆蓋getter時使用後臺字段訪問字段。 – proge