首页 > 解决方案 > NHibernate.MappingException:NHibernate.PropertyNotFoundException:找不到类中属性的getter

问题描述

nHibernate 将我的枚举映射到数据库时遇到问题。

尝试查看映射但看不到任何问题,我的怀疑是它可能与枚举有关?

这里是Fortron.Crm.Domain.Policy:

namespace Fortron.Crm.Domain
{
   [Serializable]
   public class Policy
   {
      private PolicyStatus _policyStatus;

      public PolicyStatus PolicyStatus
      {
          get { return _policyStatus; }
          set { _policyStatus = value; }
      }
   }

这是类映射

  <class name="Fortron.Crm.Domain.Policy, Fortron.Crm.Domain" table="Policy" lazy="false">
    <id name="Id" access="nosetter.camelcase-underscore" column="PolicyId" unsaved-value="-1">
      <generator class="identity" />
    </id>
    <set name="Claims" access="field.camelcase-underscore" inverse="true" lazy="false" cascade="save-update">
      <key column="PolicyId" />
      <one-to-many class="Fortron.Crm.Domain.Claim, Fortron.Crm.Domain" />
    </set>
    <many-to-one name="Product" column="ProductId" access="nosetter.camelcase-underscore" />
    <property name="PolicyNumber" />
    <property name="VehicleRegistrationNumber" />
    <property name="ContractNumber" />
    <property name="ContractPaymentAuthorised" />
    <property name="ContractPaymentAuthorisedAt" />
    <component name="Contact" access="nosetter.camelcase-underscore">
      <property name="Title" />
      <property name="GivenNames" />
      <property name="Surname" />
      <property name="BusinessName" />
      <property name="DateOfBirth" />
      <property name="Gender" column="GenderId" />
      <property name="TelephoneNumber" />
      <property name="MobileTelephoneNumber" />
      <property name="WorkTelephoneNumber" />
      <component name="Address" access="nosetter.camelcase-underscore">
        <property name="StreetLine1" column="StreetLine1" />
        <property name="StreetLine2" column="StreetLine2" />
        <property name="CityTown" column="CityTown" />
        <property name="Postcode" column="Postcode" />
        <many-to-one name="StateTerritory" column="StateTerritoryId" />
      </component>
    </component>
    <property name="CustomerNumber" column="CustomerNumber" not-null="false" />
    <property name="Vin" column="Vin" not-null="false"  />
    <property name="PolicyStatus" column="PolicyStatusId" />
  </class>

最后是堆栈跟踪:

Service cannot be started. System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> NHibernate.MappingException: Could not compile the mapping document: Fortron.Crm.Domain.Policy.hbm.xml ---> NHibernate.MappingException: Problem trying to set property type by reflection ---> NHibernate.MappingException: class Fortron.Crm.Domain.Policy, Fortron.Crm.Domain, Version=2.0.0.1, Culture=neutral, PublicKeyToken=6f168f2566a816b4 not found while looking for property: PolicyStatus ---> NHibernate.PropertyNotFoundException: Could not find a getter for property 'PolicyStatus' in class 'Fortron.Crm.Domain.Policy'
   at NHibernate.Properties.BasicPropertyAccessor.GetGetter(Type type, String propertyName)
   at NHibernate.Util.ReflectHelper.ReflectedPropertyClass(String className, String name, String accessorName)
   --- End of inner exception stack trace ---
   at NHibernate.Util.ReflectHelper.ReflectedPropertyClass(String className, String name, String accessorName)
   at NHibernate.Mapping....

有任何想法吗?

标签: c#.netnhibernatenhibernate-mapping

解决方案


更改您的会员签名以使其virtual

public virtual PolicyStatus PolicyStatus

NHibernate 期望您的实体的所有成员都virtual用于绑定。这是必要的,因为 NHibernate 在某些情况下会创建代理(以实现延迟加载)。没有标记为virtual,这对于 NHibernate 是不可能的。

您可以参考这篇(或存档)文章:

对这个问题的快速回答是:因为我们需要成员是虚拟的才能执行我们的延迟加载魔法/巫术。

不过,更长的答案更有趣。任何真正的 ORM 必须具备的一个重要特性是透明的延迟加载。如果您通过 ORM 检索对象,您不希望它自动拉入整个对象图(无论如何默认情况下都不是),但您不希望在代码中乱扔检查是否已加载某些关联然而,然后在必要时加载它们。这是 ORM 的职责。理想情况下,如果尚未检索到数据,您希望能够访问属性并让 ORM 在首次访问这些属性时加载必要的数据。

NHibernate 具有这种能力,但它不需要您从某种 NHibernate 基类继承或实现任何接口或类似的东西。那么它是怎样工作的?好吧,只要需要延迟加载,NHibernate 就会在运行时使用您的类的代理。好的,那么代理到底是什么?在这种情况下,NHibernate 代理是一种在为您的应用程序初始化 NHibernate 时动态生成的类型(这只在应用程序启动时发生一次)。将为您未显式映射的每个实体生成一个代理类型,以避免延迟加载(稍后会详细介绍)。您的一个实体的代理类型实际上将从您的实体继承,然后将拦截您可以对该类型执行的每个可能的调用。


推荐阅读