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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 13:38:17