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

标签 oop nhibernate nhibernate-mapping

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

could not resolve property: ID of: TheWorkshop.Web.Models.Customer

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

Intelisense 帮助我构建了查询并编译了解决方案,所以一个ID Customer 上的属性(property)类(class)。 ID Customer 上的属性继承自抽象 Contact依次继承自 DomainEntity<T> 的类它暴露了一个 protected 领域。

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.3-CR1来自 NHibernate 3.3.2.4000但我仍然有同样的问题。

最佳答案

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

(更简单的)解决方案是更改我的名字以匹配。有一个更难的解决方案,涉及实现 IProperyAccessor , IGetterISetter接口(interface),并提供传递字符串 ID 的路径,以便使用 ClassName access 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">

注意 我还能够在更新的 ID 映射中删除 access="field"

关于oop - NHibernate 无法解析继承属性的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15179421/

相关文章:

c# - 使用 NHibernate 创建一个 SQLite 数据库,但只创建一次

NHibernate:实体和同一查询中可能的子类的查询条件

nHibernate 多对多映射和延迟加载

matlab - 如何在 Matlab 中将某些内容包装到给定的类中

oop - CLOS 中的插槽

sql-server - 是否可以使用 `SqlDbType.Structured`在NHibernate中传递表值参数?

fluent-nhibernate - Fluent Nhibernate,如何处理实际上只有一个的有很多?

nhibernate - 在 NHibernate 中,如何找到知道其类型的持久性 POCO 类的 id 属性的名称?

oop - 我可以在许多从属设备上使用相同的 Jenkins 作业名称(即多态)吗?

java - Java中哪个线程负责什么