我有一个用NHib 1.2创建的解决方案,我们正在升级到NHib 3.0。
我们的hbm文件具有以下属性:
<property name="ContentId" column="ContentId" access="field.camelcase-underscore" />
该类没有ContentId属性。这在NHib 1.2中运行良好,但现在我们得到了以下例外:
Could not compile the mapping document: XXXX.Core.Domain.Video.hbm.xml ---> NHibernate.MappingException: Problem trying to set property type by reflection ---> NHibernate.MappingException: class Core.Domain.Video, Core, Version=1.0.0.29283, Culture=neutral, PublicKeyToken=null not found while looking for property: ContentId ---> NHibernate.PropertyNotFoundException: Could not find the property 'ContentId', associated to the field '_contentId', in class 'Core.Domain.Video'.
为什么停止工作?它在NHib 3中是否仍受支持?
我们可能需要添加许多这样的属性。
答案 0 :(得分:10)
NHibernate极大地改进了NH2.X中的错误消息和诊断以及NH3.X中的错误消息和诊断。你告诉NHibernate你有一个属性,你想通过字段访问映射到_camelCase约定命名的字段。你没有名为ContentId的属性,NHibernate让你知道你撒谎了。 :)
尝试将映射更新为:
<property name="_contentId" column="ContentId" access="field" />
您需要更新任何HQL或Criteria查询以使用_contentId而不是ContentId。另一种选择是添加私有的ContentId属性。
答案 1 :(得分:1)
我想提供帮助我回答这个问题的信息:
在此链接中,Fabio解释了您遇到的同样问题:
此映射
<property name="PositiveValue" access="field.camelcase-underscore" />
意思是:对于名为“PositiveValue”的财产,您(NH)必须访问 场;发现哪个是您(NH)必须的相关领域 使用策略“camelcase-underscore”。
如果没有属性,则无法使用具有特定属性的访问者 策略。
这让我感到有些奇怪,因为它意味着添加虚拟的,未使用的属性,只是为了让nhibernate3编译器感到高兴。基础功能是相同的。