如何阻止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
相关产品推荐
相关产品推荐

