NHibernate无法解析继承属性的属性

时间:2013-03-02 21:04:30

标签: oop nhibernate nhibernate-mapping

为什么NHibernate不能访问从抽象基类继承的属性。当我尝试在QueryOver条款的Where中使用该属性时,我正在

  

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

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

Intelisense帮助我构建了查询并编译了解决方案,因此 <{1}}类上的ID属性。 Customer上的Customer属性继承自抽象ID类,而后者继承自公开受保护字段的Contact

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

    //... 
}

answer to a similar question后我从<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-CR1,但我仍然遇到同样的问题。

1 个答案:

答案 0 :(得分:0)

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

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

两个解决方案中较简单的只是将ID重命名为ClassName(并更新对它的所有引用),所以

_persistenceId

变为

_id

注意我还可以在更新的ID映射中删除<id name="_persistenceId" column="ID" type="Guid" access="field" unsaved-value="00000000-0000-0000-0000-000000000000">