Entity Framework Code First中DateTime属性自动转为TimeStamp如何解决
问题产生原因
- 第一类是EF数据库提供程序的默认映射规则:你使用的数据库对应EF提供程序(比如MySQL、Oracle、PostgreSQL的EF/EF Core驱动)内置了命名约定,当DateTime类型属性名称包含
CREATION_DATE、TIMESTAMP这类关键词时,会自动映射为数据库端的Timestamp类型用于行版本追踪或并发控制。 - 第二类是项目自定义配置导致:你可能在实体属性上误加了
[Timestamp]特性,或是在DbContext的Fluent API配置、全局约定配置中,指定了DateTime类型或该名称属性的默认映射类型为Timestamp。
解决方案
方案1:通过数据注解显式指定字段类型
直接在属性上添加[Column]特性明确指定数据库字段类型,根据你使用的数据库调整类型名即可,示例代码如下:
using System.ComponentModel.DataAnnotations.Schema; // SQL Server可填"datetime"或"datetime2",MySQL/PostgreSQL填对应datetime类型名即可 [Column(TypeName = "datetime")] public DateTime CREATION_DATE { get; set; }
方案2:通过Fluent API显式配置映射
如果你的项目统一使用Fluent API做实体配置,可以在DbContext的OnModelCreating方法中指定该属性的映射规则:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 将<YourEntity>替换为你的实体类名称 modelBuilder.Entity<YourEntity>() .Property(p => p.CREATION_DATE) .HasColumnType("datetime"); }
方案3:清理错误的全局约定配置
如果检查发现项目中配置了全局自动映射规则,将包含特定关键词的DateTime属性默认映射为Timestamp,删除对应全局配置即可。
完成配置后删除之前生成的错误迁移文件,重新执行add-migration命令生成新迁移,即可确认字段类型已按预期生成。
内容的提问来源于stack exchange,提问作者Raed Alsaleh
相关产品推荐
相关产品推荐

