.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
相关产品推荐
相关产品推荐

