.NET Core3.2升级至7.0后EF单元测试出现PostgreSQL类型不匹配错误
针对升级.NET 7后EF Core操作PostgreSQL出现的类型不匹配问题,按以下步骤排查:
确认Npgsql EF Core驱动版本
升级.NET 7时,必须同步将Npgsql.EntityFrameworkCore.PostgreSQL包升级到7.x系列版本(与.NET版本匹配)。旧版本驱动与.NET 7的类型映射逻辑存在差异,可能导致命名含"Id"的string字段被错误识别为uuid类型。显式强制字段类型映射
在实体类属性上添加DataAnnotation,明确指定数据库列类型,覆盖EF Core的默认推断:public class ApplicationUser : IdentityUser<Guid> { [Column(TypeName = "text")] public string DefaultResourceId { get; set; } }同时确保
OnModelCreating中的配置生效,可重新生成EF快照验证配置是否正确。检查全局类型配置
查看DbContext的OnModelCreating方法,是否存在全局类型转换或默认映射规则(比如将string类型全局映射为uuid)。升级后若引入此类配置,会影响该字段的映射逻辑,需针对性排除DefaultResourceId字段。验证数据库实际列类型
执行SQL查询确认数据库中列的真实类型,避免主观判断错误:SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'AspNetUsers' AND column_name = 'DefaultResourceId';若实际类型为uuid,需执行迁移修改为text类型。
排查空值触发的类型推断
代码中创建ApplicationUser时未给DefaultResourceId赋值,但数据库列是非空约束。EF Core 7与Npgsql驱动对空string的处理逻辑可能变化,尝试赋值非空string测试:var user = new ApplicationUser { Id = Guid.NewGuid(), DefaultResourceId = "default-resource" };若不再报错,说明空值导致驱动错误推断类型,需确保字段始终有非空值,或调整数据库约束(若业务允许)。
清理EF Core模型缓存
测试环境中可能存在旧模型缓存,清理项目的bin/obj目录,重新生成解决方案;或在测试初始化时强制重建DbContext模型,避免缓存的旧映射逻辑干扰。
内容的提问来源于stack exchange,提问作者jelhajj

