.NET 7脚手架生成User类与PostgreSQL表字段映射失败问题
解决方案
是的,需要通过字段映射解决实体属性与数据库列名不匹配的问题,以下是几种可行方案:
方法一:重新生成实体类时指定命名约定(推荐)
EF Core脚手架默认将数据库snake_case列名转为PascalCase属性名,但PostgreSQL对列名大小写敏感(未加引号时默认小写)。可以通过脚手架参数让生成的代码自动适配:
执行以下命令重新生成实体类,直接匹配数据库列名:
dotnet ef dbcontext scaffold "Server=myServer;Port=MyPort;Database=MyDB;User Id=myUser;Password=MyPassword" Npgsql.EntityFrameworkCore.PostgreSQL --use-database-names --output-dir Models
或者生成带数据注解的实体类,自动添加列映射:
dotnet ef dbcontext scaffold "你的连接字符串" Npgsql.EntityFrameworkCore.PostgreSQL --data-annotations --output-dir Models
方法二:手动添加字段映射(快速修复)
方式1:使用数据注解
在User实体的Emails属性上添加[Column]注解,指定对应数据库列名:
using System.ComponentModel.DataAnnotations.Schema; public partial class User { // ... 其他属性 [Column("emails")] public string? Emails { get; set; } // 同理,其他不匹配的属性也可添加注解 [Column("phone_numbers")] public string? PhoneNumbers { get; set; } [Column("updated_on")] public DateTime? UpdatedOn { get; set; } // ... 其他属性 }
方式2:使用Fluent API配置
在AppDbContext中重写OnModelCreating方法,通过Fluent API配置属性与列的映射:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<User>() .Property(u => u.Emails) .HasColumnName("emails"); modelBuilder.Entity<User>() .Property(u => u.PhoneNumbers) .HasColumnName("phone_numbers"); modelBuilder.Entity<User>() .Property(u => u.UpdatedOn) .HasColumnName("updated_on"); // 其他属性映射同理 }
额外优化建议
控制器中直接实例化AppDbContext的方式不符合依赖注入规范,建议改为通过构造函数注入获取:
private readonly AppDbContext _dbContext; // 构造函数注入 public YourController(AppDbContext dbContext) { _dbContext = dbContext; } public IActionResult AddUser() { var nuser = new User { FirstName="Joe", LastName="doe", Username="jodoe", Emails = "jodoe@mysite.com"}; _dbContext.users.Add(nuser); _dbContext.SaveChanges(); return Ok(); }
同时在Program.cs中注册DbContext:
builder.Services.AddDbContext<AppDbContext>(options => options.UseNpgsql(builder.Configuration.GetConnectionString("profiles_editor_data")));
内容的提问来源于stack exchange,提问作者Jose Cabrera Zuniga
相关产品推荐
相关产品推荐

