3

为什么 NHibernate 不能访问从抽象基类继承的属性。当我尝试QueryOverWhere子句中使用属性时,我得到

无法解析属性:ID:TheWorkshop.Web.Models.Customer

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

Intelisense 帮助我构建查询并编译解决方案,因此类上一个ID属性Customer。Customer的ID属性继承自抽象Contact类,抽象类又继承自DomainEntity<T>暴露受保护字段的 a。

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">

回答了一个类似问题后,我更新为NHibernate 3.3.3-CR1fromNHibernate 3.3.2.4000但我仍然遇到同样的问题。

4

1 回答 1

0

问题是 NHibernate 无法从我的映射中推断出如何解析 ID 属性。因此,尽管类编译得很好并且_persistenceId抽象基类上的属性可以通过getter实现类上的 a 访问,但由于名称不匹配,_persistenceIdNHibernateID无法遵循这一点。

(更简单的)解决方案是更改我的名字以匹配。有一个更难的解决方案涉及实现IProperyAccessorIGetterISetter接口,以便提供传递字符串的路径ID,以便使用ClassName 访问策略

两种解决方案中较简单的只是重命名_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 映射

于 2013-03-03T16:40:34.907 回答