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

.NET Core3.2升级至7.0后EF单元测试出现PostgreSQL类型不匹配错误

解决思路

针对升级.NET 7后EF Core操作PostgreSQL出现的类型不匹配问题,按以下步骤排查:

  1. 确认Npgsql EF Core驱动版本
    升级.NET 7时,必须同步将Npgsql.EntityFrameworkCore.PostgreSQL包升级到7.x系列版本(与.NET版本匹配)。旧版本驱动与.NET 7的类型映射逻辑存在差异,可能导致命名含"Id"的string字段被错误识别为uuid类型。

  2. 显式强制字段类型映射
    在实体类属性上添加DataAnnotation,明确指定数据库列类型,覆盖EF Core的默认推断:

    public class ApplicationUser : IdentityUser<Guid>
    {
        [Column(TypeName = "text")]
        public string DefaultResourceId { get; set; }
    }
    

    同时确保OnModelCreating中的配置生效,可重新生成EF快照验证配置是否正确。

  3. 检查全局类型配置
    查看DbContext的OnModelCreating方法,是否存在全局类型转换或默认映射规则(比如将string类型全局映射为uuid)。升级后若引入此类配置,会影响该字段的映射逻辑,需针对性排除DefaultResourceId字段。

  4. 验证数据库实际列类型
    执行SQL查询确认数据库中列的真实类型,避免主观判断错误:

    SELECT column_name, data_type 
    FROM information_schema.columns 
    WHERE table_name = 'AspNetUsers' AND column_name = 'DefaultResourceId';
    

    若实际类型为uuid,需执行迁移修改为text类型。

  5. 排查空值触发的类型推断
    代码中创建ApplicationUser时未给DefaultResourceId赋值,但数据库列是非空约束。EF Core 7与Npgsql驱动对空string的处理逻辑可能变化,尝试赋值非空string测试:

    var user = new ApplicationUser
    {
        Id = Guid.NewGuid(),
        DefaultResourceId = "default-resource"
    };
    

    若不再报错,说明空值导致驱动错误推断类型,需确保字段始终有非空值,或调整数据库约束(若业务允许)。

  6. 清理EF Core模型缓存
    测试环境中可能存在旧模型缓存,清理项目的bin/obj目录,重新生成解决方案;或在测试初始化时强制重建DbContext模型,避免缓存的旧映射逻辑干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:50:22