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

.NET 5与EF Core 5使用HierarchyId时抛出Int16转String强制转换错误

问题根源

你遇到的报错是EF Core 5配套的HierarchyId库和Microsoft.Data.SqlClient包版本不兼容导致的。从错误栈可以看到,底层SqlClient读取HierarchyId类型数据时,错误返回了Int16类型的中间值,而EF Core的HierarchyId序列化逻辑尝试直接读取字符串,就触发了类型转换失败。

解决步骤
  • 升级Microsoft.Data.SqlClient包版本
    你现在用的EF Core 5.0.9对应的HierarchyId包,要求Microsoft.Data.SqlClient版本至少为2.1.0,你可以通过NuGet包管理器将该包升级到2.1.x的最新稳定版(不要升到3.x及以上版本,避免和.NET 5不兼容)。
  • 校验实体属性配置
    确认你的实体类中HierarchyId属性没有加错误的类型限制,直接声明即可:
    public HierarchyId MyItemHierarchyId { get; set; }
    
    不要手动给该属性加[Column(TypeName = "varchar")]这类注解,只要迁移生成的数据库字段类型为hierarchyid就无需额外配置。
  • 清理项目缓存
    升级包后删除项目的bin、obj文件夹,重新生成解决方案后再运行测试即可。
临时兼容方案

如果暂时无法升级依赖包,可以在DbContext的OnModelCreating方法中给HierarchyId属性添加值转换器临时解决:

modelBuilder.Entity<myTableItem>()
    .Property(p => p.myItemHierarchyId)
    .HasConversion(
        hId => hId.ToString(),
        str => HierarchyId.Parse(str));

该方案通过显式的字符串和HierarchyId类型转换绕开底层版本兼容问题,不影响业务逻辑正常运行。

内容的提问来源于stack exchange,提问作者Christopher Whitfield

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:15:00