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

EF对接PostgreSQL报42703错误:列b.Id不存在求助

解决EF对接PostgreSQL时"column b.Id does not exist"错误

问题原因

PostgreSQL默认会把未加引号的标识符(表名、列名)自动转为小写,但EF Core默认会将模型属性名(比如Id)生成为带大写的标识符,导致数据库找不到对应的小写列id,从而触发该错误。

解决方案

以下是几种可行的解决方式,按需选择:

1. 单个属性显式指定列名

在模型的Id属性上添加[Column]特性,明确指定数据库中的列名:

[Table("blacklisted_people", Schema ="public")]
public class BlackListedPeople
{
    [Key]
    [Column("id")] // 指定数据库列名为小写的id
    public int Id { get; set; }
}

2. 全局配置小写命名约定(推荐)

在DbContext的OnModelCreating方法中配置全局规则,让EF自动将所有属性名转为小写,无需逐个实体配置:

public class ApplicationDbContext:DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> dbContextOptions)
        : base(dbContextOptions)
    {}

    public DbSet<BlackListedPeople> BlackList { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // 遍历所有实体,将属性名转为小写作为数据库列名
        foreach (var entity in modelBuilder.Model.GetEntityTypes())
        {
            foreach (var property in entity.GetProperties())
            {
                property.SetColumnName(property.Name.ToLower());
            }
        }
    }
}

3. 修改数据库列名(不推荐)

如果允许修改数据库结构,可以将列名改为大写Id,注意需要用双引号包裹(PostgreSQL仅对加引号的标识符保留大小写):

alter table blacklisted_people rename column id to "Id";

验证

修改完成后重新执行await _dbContext.BlackList.FindAsync(1);,EF生成的SQL会正确匹配数据库列名,即可解决该错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 08:35:12