c# - 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....
有任何想法吗?
解决方案
更改您的会员签名以使其virtual
:
public virtual PolicyStatus PolicyStatus
NHibernate 期望您的实体的所有成员都virtual
用于绑定。这是必要的,因为 NHibernate 在某些情况下会创建代理(以实现延迟加载)。没有标记为virtual
,这对于 NHibernate 是不可能的。
对这个问题的快速回答是:因为我们需要成员是虚拟的才能执行我们的延迟加载魔法/巫术。
不过,更长的答案更有趣。任何真正的 ORM 必须具备的一个重要特性是透明的延迟加载。如果您通过 ORM 检索对象,您不希望它自动拉入整个对象图(无论如何默认情况下都不是),但您不希望在代码中乱扔检查是否已加载某些关联然而,然后在必要时加载它们。这是 ORM 的职责。理想情况下,如果尚未检索到数据,您希望能够访问属性并让 ORM 在首次访问这些属性时加载必要的数据。
NHibernate 具有这种能力,但它不需要您从某种 NHibernate 基类继承或实现任何接口或类似的东西。那么它是怎样工作的?好吧,只要需要延迟加载,NHibernate 就会在运行时使用您的类的代理。好的,那么代理到底是什么?在这种情况下,NHibernate 代理是一种在为您的应用程序初始化 NHibernate 时动态生成的类型(这只在应用程序启动时发生一次)。将为您未显式映射的每个实体生成一个代理类型,以避免延迟加载(稍后会详细介绍)。您的一个实体的代理类型实际上将从您的实体继承,然后将拦截您可以对该类型执行的每个可能的调用。
推荐阅读
- php - 登录 MySQL 失败(HY000/2054):服务器向客户端发送未知字符集。这是什么意思以及如何解决?
- php - 使用 curl PHP 获取其他网站中表格上的特定目标或数据
- verilog - Verilog上“for”循环内的localparam错误
- javascript - 检查 div 内容是否包含数组中的单词并替换它
- python-3.x - Pyinstaller 不包含 libsndfile
- python - 为什么在使用 python 单例模式时它只实现最后一个实例
- php - 如果第一个 ACF 中继器字段为空,则打印内容
- c++ - 有没有办法以编程方式填充椭圆参数?
- javascript - 如何解决 Heroku 上找不到的模块?
- apache-kafka - 如何使用 Flume 下沉话题,从 kafka 到 kafka?