2013-03-02 72 views
3

爲什麼NHibernate不能訪問從抽象基類繼承的屬性。當我嘗試使用在QueryOver屬性的Where子句中我得到NHibernate無法解析繼承屬性的屬性

無法解析屬性:ID:TheWorkshop.Web.Models.Customer

var customer = Session.QueryOver<Customer>() 
         .Where(c=>c.ID ==id) 
         .SingleOrDefault<Customer>(); 

智能感知幫助我建立查詢和解決方案編譯,所以有ID屬性在Customer類。 Customer上的ID屬性繼承自摘要Contact類,該類繼而繼承DomainEntity<T>,該DomainEntity<T>公開受保護的字段。

public abstract class DomainEntity<T> 
{ 
    protected Guid _persistenceId; 
    //... 
} 

public abstract class Contact : DomainEntity<Contact> 
{ 
    public virtual Guid ID 
    { 
     get { return _persistenceId; } 
    } 

    public virtual Address Address 
    { 
     get { return _address; } 
     set { _address = value; } 
    } 

    //... 
} 

,並在映射文件

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="TheWorkshop.Web" 
        namespace="TheWorkshop.Web.Models" 
        default-access="field.camelcase-underscore" 
        default-lazy="true"> 
    <class name="Contact" table="Contacts" abstract="true"> 
     <id name="_persistenceId" column="ID" type="Guid" access="field" 
      unsaved-value="00000000-0000-0000-0000-000000000000"> 
     <generator class="guid.comb" /> 
     </id> 
     <!-- ... --> 
     <union-subclass name="Customer" table="Customers"> 

answer to a similar question我從NHibernate 3.3.2.4000更新NHibernate 3.3.3-CR1,但我仍然有同樣的問題。

回答

0

問題是,NHibernate無法從我的映射推斷如何解決ID屬性。因此,雖然編譯好的類和抽象基類的_persistenceId屬性可以通過getter在實現類上訪問,但由於_persistenceIdID之間的名稱不匹配,NHibernate無法遵循這一點。

(更簡單)的解決方案是改變我的名字來匹配。有一個更難的解決方案,其中包括實施IProperyAccessor,IGetterISetter接口,並提供路徑以傳遞字符串ID以便使用ClassNameaccess strategy

兩個解決方案的簡單只是重命名_persistenceId_id(和更新它的所有引用),所以

<id name="_persistenceId" column="ID" type="Guid" access="field" 
    unsaved-value="00000000-0000-0000-0000-000000000000"> 

成爲

<id name="Id" column="Id" type="Guid" 
    unsaved-value="00000000-0000-0000-0000-000000000000"> 

注意我也能將access="field"放在更新的id映射中