C#插入PostgreSQL数据时如何将PascalCase字段自动映射为小写列名
解决方案
你可以通过EF Core的全局模型配置实现自动映射,不需要修改任何现有模型字段和业务引用,以下是两种常用实现方案:
方案1:全局属性名转小写映射(适配当前数据库全小写列名场景)
直接在你的DbContext类中重写OnModelCreating方法,遍历所有实体的所有属性,统一将映射的列名改为小写即可:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 遍历上下文中注册的所有实体 foreach (var entity in modelBuilder.Model.GetEntityTypes()) { // 遍历实体的所有属性 foreach (var property in entity.GetProperties()) { // 直接将属性名转小写作为映射的数据库列名 property.SetColumnName(property.Name.ToLower()); } } }
配置完成后,你示例中ApplicationStarted模型的ApplicationStartedRecord属性会自动映射到数据库的applicationstartedrecord列,完全不需要修改现有模型代码和业务引用。
方案2:蛇形命名映射(PostgreSQL官方推荐规范,可选)
如果你的数据库后续也遵循PostgreSQL生态常用的蛇形小写命名规则(比如ApplicationStartedRecord映射为application_started_record),可以直接使用Npgsql官方提供的命名扩展,安装Npgsql.EntityFrameworkCore.PostgreSQL包后,在服务注册DbContext的位置添加配置即可:
builder.Services.AddDbContext<你的上下文类名>(options => options.UseNpgsql("你的数据库连接字符串") .UseSnakeCaseNamingConvention());
这个方案会自动把所有PascalCase的模型名、属性名转换为蛇形小写的表名、列名,是PostgreSQL开发的标准实践。
报错原因说明
你遇到的sequence contains no matching element报错本质是EF Core默认生成的SQL语句中使用了PascalCase的列名,而PostgreSQL默认大小写敏感,带双引号的大写列名无法匹配全小写的实际列名,上述配置会让EF生成SQL时自动使用转换后的小写列名,即可正常匹配数据库结构。
内容的提问来源于stack exchange,提问作者tim neet
相关产品推荐
相关产品推荐

