EF Core代码优先模式新增列失败,遇UTC DateTime类型转换异常
解决EF Core Code First新增列时的DateTime类型匹配错误
你新增Place列时触发迁移报错,本质是现有CreatedDate/UpdateDate字段的timestamp without time zone类型,和EF Core生成UTC DateTime值的逻辑冲突导致的。以下是几种可行解决方案:
方案1:调整日期字段的数据库类型为带时区类型
把timestamp without time zone改成timestamp with time zone,匹配EF Core的UTC DateTime处理:
public class Student { // 其他字段保持不变 [Column(TypeName = "timestamp with time zone")] public DateTime CreatedDate{ get; set; } [Column(TypeName = "timestamp with time zone")] public DateTime? UpdateDate { get; set; } public String Place{ get; set; } // new column }
或者改用DateTimeOffset类型(EF Core会自动映射到timestamp with time zone):
public class Student { // 其他字段保持不变 public DateTimeOffset CreatedDate{ get; set; } public DateTimeOffset? UpdateDate { get; set; } public String Place{ get; set; } // new column }
方案2:配置EF Core将DateTime视为非UTC时间
如果坚持用timestamp without time zone,在DbContext的配置中告诉EF Core不要把DateTime当作UTC处理(以PostgreSQL为例):
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { options.UseNpgsql("你的连接字符串", o => o.UseDateTimeKind(DateTimeKind.Unspecified)); }
方案3:手动修正迁移文件
生成迁移后,打开自动生成的迁移类,删除对CreatedDate/UpdateDate字段的修改代码,只保留新增Place列的逻辑:
protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.AddColumn<string>( name: "Place", table: "Students", type: "text", // 根据你的数据库调整类型,比如SQL Server用nvarchar(max) nullable: true); } protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropColumn( name: "Place", table: "Students"); }
之后执行迁移即可。
内容的提问来源于stack exchange,提问作者user1528398
相关产品推荐
相关产品推荐

