为什么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
,但我仍然遇到同样的问题。
答案 0 :(得分:0)
问题在于NHibernate无法从我的映射中推断出如何解析ID属性。因此,尽管编译的类很好,并且可以通过实现类上的_persistenceId
访问抽象基类上的getter
属性,因为_persistenceId
和{{1}之间的名称不匹配NHibernate无法遵循这一点。
(更简单)解决方案是更改我的名字以匹配。有一个更难的解决方案涉及实现IProperyAccessor,IGetter和ISetter接口,以便提供传递字符串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">