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

如何阻止Entity Framework更新模型时修改指定表的列名(保留下划线)?

解决Entity Framework更新模型时移除JsonPropertyName注解及列名问题

方法一:用部分类分离数据注解

EF自动生成的实体类都是partial类型,你可以手动创建一个同名的部分类文件,把JsonPropertyName注解放在这个独立文件里——重新更新模型时,自动生成的文件会被覆盖,但你手动创建的部分类文件不会受影响,注解就能保留下来。

示例:
自动生成的实体类(不要修改这个文件):

namespace YourProject.Models
{
    public partial class YourEntity
    {
        public string DesChkHecli { get; set; }
    }
}

手动新建的部分类文件(放在Models目录下,命名比如YourEntity.Extensions.cs):

using System.Text.Json.Serialization;
using YourProject.Models;

namespace YourProject.Models
{
    public partial class YourEntity
    {
        [JsonPropertyName("DES_CHK_HECLI")]
        public string DesChkHecli { get; set; }
    }
}

注意要保证属性的签名和自动生成的完全一致,这样编译器会合并两个部分类的定义。

方法二:修改EF脚手架规则,直接使用数据库列名

在执行EF模型生成命令时,添加--use-database-names参数,这样EF会直接把数据库的列名(带下划线)作为实体的属性名,不需要额外加JsonPropertyName注解。

Package Manager Console命令示例:

Scaffold-DbContext "你的数据库连接字符串" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models --use-database-names

.NET CLI命令示例:

dotnet ef dbcontext scaffold "你的数据库连接字符串" Microsoft.EntityFrameworkCore.SqlServer -o Models --use-database-names

方法三:全局配置JSON序列化命名策略

如果所有实体属性都需要转成下划线大写的格式,可以在项目的全局配置里设置JSON序列化规则,避免给每个属性单独加注解。

在Program.cs中添加如下配置:

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.PropertyNamingPolicy = new UnderlineUpperCaseNamingPolicy();
    });

// 自定义下划线大写命名策略类
public class UnderlineUpperCaseNamingPolicy : JsonNamingPolicy
{
    public override string ConvertName(string name)
    {
        // 将帕斯卡命名(如DesChkHecli)转换为下划线分隔的大写格式(如DES_CHK_HECLI)
        return string.Concat(name.Select((c, index) => 
            index > 0 && char.IsUpper(c) ? $"_{c}" : c.ToString())).ToUpper();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 09:33:21