使用NHibernate从含外键的MySQL表取数据时遇类型转换异常
解决NHibernate PropertyAccessException:类型转换错误问题
嘿,我帮你捋捋这个NHibernate抛出的类型转换异常问题——这大概率是实体类、数据库字段和NHibernate映射文件三者的类型没对齐导致的,咱们一步步排查:
1. 核对实体类与数据库字段的类型一致性
- 先盯紧
Book类里的AuthorId、PublishingId这两个外键属性:数据库里这两个字段如果是INT类型,实体类就不能写成string或者long;要是数据库用了UNSIGNED INT,那实体类得对应用uint这类兼容类型。 - 别忽略其他属性,比如书名、页数这类字段,数据库是
VARCHAR(255)的话,实体类写成char[]绝对会踩坑。
2. 检查NHibernate映射文件的配置细节
- 打开你的
Book映射文件(比如Book.hbm.xml),逐一核对每个节点:- 对于
<many-to-one>节点,比如<many-to-one name="Author" column="AuthorId" class="Author" />,要确保column对应的数据库字段类型,和Author类的主键类型、Book类里AuthorId的属性类型完全匹配。 - 如果手动指定了
type属性,比如<property name="Price" type="decimal(18,2)" />,得保证实体类里的Price是decimal类型,而不是float或者double。 - 还要注意属性名的大小写!比如实体类是
authorId,映射里写成AuthorId,NHibernate找不到正确属性,也会触发类型转换错误。
- 对于
3. 排查查询代码的参数类型匹配
- 看看你在
BookController里写的HQL或者Criteria查询,有没有手动做了错误的类型转换?比如下面这种情况:
传递参数时,类型必须和数据库字段严格对应。var books = session.CreateQuery("from Book where AuthorId = :authorId") .SetParameter("authorId", "123") // 这里AuthorId是int类型,传string就会报错 .List<Book>();
4. 验证主键与外键的类型兼容性
- 确认
Author和PublishingHouse的主键类型:如果它们的主键是Guid,那Book里的AuthorId也得是Guid类型;如果是自增int主键,外键也必须是int类型,映射文件也要对应配置正确。
快速调试小技巧
- 开启NHibernate的SQL日志,能帮你快速定位问题。在NHibernate配置里加上这两行:
这样就能在控制台或日志里看到实际执行的SQL语句,对比参数和字段的类型差异,问题一下子就明了了。<property name="show_sql">true</property> <property name="format_sql">true</property>
内容的提问来源于stack exchange,提问作者user9039879
相关产品推荐
相关产品推荐

