使用EF Core从PostgreSQL生成DbContext时如何禁用NodaTime?
解决EF Core脚手架持续生成NodaTime类型的问题
要让数据库优先的脚手架工具改用.NET原生类型(如System.DateTime),需按以下步骤操作:
卸载NodaTime相关NuGet包
Npgsql的EF Core脚手架会自动检测项目中是否安装了Npgsql.EntityFrameworkCore.PostgreSQL.NodaTime包——只要这个包存在,就会默认把PostgreSQL的timestamp等类型映射为NodaTime类型。需要卸载以下两个包:Npgsql.EntityFrameworkCore.PostgreSQL.NodaTimeNpgsql.NodaTime(如果项目中没有其他地方依赖它)
执行命令卸载:
dotnet remove package Npgsql.EntityFrameworkCore.PostgreSQL.NodaTime dotnet remove package Npgsql.NodaTime彻底移除DbContext配置中的NodaTime代码
把Program.cs里原本的UseNodaTime()调用(包括注释掉的)完全删除,确保配置干净:builder.Services.AddDbContextFactory<TheDbContext>(options => { options.UseNpgsql(dbConnection, conf => { conf.EnableRetryOnFailure(); conf.CommandTimeout(2); }); });清理缓存后重新执行脚手架命令
先清理项目构建缓存,避免残留配置干扰:dotnet clean再重新运行脚手架生成命令,此时Npgsql会默认映射到.NET原生类型:
dotnet ef dbcontext scaffold [connection-string-redacted] Npgsql.EntityFrameworkCore.PostgreSQL ...(可选)批量修正已生成的模型
如果之前已经生成了带NodaTime类型的模型类,可以批量替换:- 将
NodaTime.LocalDateTime替换为System.DateTime(对应PostgreSQL的timestamp类型) - 将
NodaTime.ZonedDateTime替换为System.DateTimeOffset(对应PostgreSQL的timestamp with time zone类型)
- 将
内容的提问来源于stack exchange,提问作者Joe Ballard
相关产品推荐
相关产品推荐

