NHibernate版本控制映射报错:class元素含无效子元素version
NHibernate版本映射错误解决方案
错误原因
你遇到的"The element 'class' in namespace 'urn:nhibernate-mapping-2.2' has invalid child element 'version'"错误,核心原因有两个:
- 映射文件中
<version>的类型写法不符合NHibernate规范,误用了C#的int?语法而非NHibernate支持的类型标识 - 少数情况下是Visual Studio的XML Schema缓存不匹配引发的验证错误
修复步骤
1. 修正版本属性的映射类型
将<version>元素的type属性改为NHibernate支持的可空整数类型标识,比如nullable:int;若实体类中Version属性已定义为int?,也可直接使用type="int",NHibernate会自动适配可空性。
修复后的映射文件示例:
<?xml version="1.0" encoding="utf-8"?> <hibernate-mapping namespace="Model" assembly="Model" xmlns="urn:nhibernate-mapping-2.2"> <class name="Bar" lazy="true" table="`BAR`" schema="`dbo`"> <id name="ID" access="property" column="`ID`"> <generator class="assigned" /> </id> <version name="Version" column="`VERSION`" type="nullable:int" /> </class> </hibernate-mapping>
2. 验证元素顺序(可选)
NHibernate映射文件对元素顺序有严格要求:<version>必须紧跟在<id>/<composite-id>之后,且在<property>等其他元素之前。你的代码中顺序是正确的,后续添加属性时需注意遵循该规则。
3. 刷新Visual Studio Schema缓存(可选)
若修改后仍报错,可尝试:
- 右键映射文件 → 选择"Properties"
- 在"Schemas"选项中,确保引用了与NHibernate版本匹配的XSD文件(可从NHibernate安装目录获取)
- 清理并重建项目
参考资料翻译
NHibernate版本属性定义要点:
- 版本属性必须是实体类中的持久化属性,支持类型包括int、long、DateTime或Timestamp
- 映射文件中
<version>的位置必须符合Schema规定的顺序 - 数据库中
VERSION字段的类型需与映射类型匹配(如int类型对应数据库INT)
NHibernate并发控制映射说明:
- 版本控制用于实现乐观锁,通过更新时检查版本号避免并发修改冲突
- 每次更新操作时,NHibernate会自动递增版本号,并在UPDATE语句中加入版本号条件,若版本不匹配则抛出
StaleObjectStateException - 可选择
<version>(数值型)或<timestamp>(时间戳型)两种方式实现乐观锁
内容的提问来源于stack exchange,提问作者Edison C
相关产品推荐
相关产品推荐

