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

