You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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安装目录获取)
  • 清理并重建项目

参考资料翻译

  1. NHibernate版本属性定义要点:

    • 版本属性必须是实体类中的持久化属性,支持类型包括int、long、DateTime或Timestamp
    • 映射文件中<version>的位置必须符合Schema规定的顺序
    • 数据库中VERSION字段的类型需与映射类型匹配(如int类型对应数据库INT)
  2. NHibernate并发控制映射说明:

    • 版本控制用于实现乐观锁,通过更新时检查版本号避免并发修改冲突
    • 每次更新操作时,NHibernate会自动递增版本号,并在UPDATE语句中加入版本号条件,若版本不匹配则抛出StaleObjectStateException
    • 可选择<version>(数值型)或<timestamp>(时间戳型)两种方式实现乐观锁

内容的提问来源于stack exchange,提问作者Edison C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:06:02