为什么 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
访问,但由于 之间的名称不匹配_persistenceId
和 ID
NHibernate 无法遵循这一点。
(更简单的)解决方案是更改我的名字以匹配。有一个更难的解决方案,涉及实现 IProperyAccessor , IGetter和 ISetter接口(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/