2013-03-02 55 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映射中