千家信息网

Entity Framework Core如何更新时间映射

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章主要介绍了Entity Framework Core如何更新时间映射,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。时间字段在真
千家信息网最后更新 2026年11月04日Entity Framework Core如何更新时间映射

这篇文章主要介绍了Entity Framework Core如何更新时间映射,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

时间字段

在真实的开发中,为了跟踪数据的变化,一般会在数据表里面有CreatedTime和UpdatedTime两列。CreatedTime表示创建时间,新增一条数据的时候,会更新CreatedTime列的值。UpdatedTime表示更新时间,更新数据的同时也会更新UpdatedTime列的值,这时候就需要对应的映射来配置。我们修改Blog类,增加这两个时间字段:

using System;namespace EFCore.Model{    public  class Blog    {        public int Id { get; set; }        public string Name { get; set; }        ///         /// 创建时间        ///         public DateTime CreatedTime { get; set; }        ///         /// 添加时间        ///         public DateTime UpdatedTime { get; set; }    }}

这时不做任何配置,使用迁移的方式生成数据库,查看数据库表结构:

可以看到数据库里面生成的是datetime2类型的,datetime2的精度非常高。但是一般情况下不使用datetime2高精度的,使用datetime就可以了,这时候就需要我们自己做映射来配置生成datetime类型。

修改数据上下文类,增加时间字段的映射配置,代码如下:

using EFCore.Model;using Microsoft.EntityFrameworkCore;namespace EFCore.Data{    ///     /// 数据上下文    ///     public class EFDbContext : DbContext    {        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)        {            optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=EFTest;User ID=sa;Password=123456;");        }        public DbSet Blogs { get; set; }        ///         /// 重写OnModelCreating方法,配置映射        ///         ///         protected override void OnModelCreating(ModelBuilder modelBuilder)        {            // 配置表名映射            modelBuilder.Entity().ToTable("Blog");            // 将表名长度设置为250会报错,表名最大长度限制为128            //var tableName = string.Join("", Enumerable.Repeat("t", 250).ToArray());            //modelBuilder.Entity().ToTable(tableName);            modelBuilder.Entity(p =>            {                // 配置CreatedTime字段                p.Property(t => t.CreatedTime)                // 设置列的类型是DATETIME                 .HasColumnType("DATETIME")                 // 设置列的默认值                 .HasDefaultValueSql("GETDATE()");                // 配置UpdatedTime字段                p.Property(t => t.UpdatedTime)                // 设置列的类型是DATETIME                .HasColumnType("DATETIME")                // 设置列的默认值                .HasDefaultValueSql("GETDATE()");            });            base.OnModelCreating(modelBuilder);        }    }}

在使用数据迁移的方式生成数据库表,然后查看列的数据类型:

这时候时间列的数据类型就是datetime类型了。在代码里面给时间字段设置了默认值,我们添加一条种子数据,然后新增到数据库,看看会不会自动生成默认值:

从截图中可以看出:新增数据的时候,CreatedTime和UpdatedTime会自动赋当前时间的值。在修改刚才添加的种子数据,看看UdpatedTime列的值会不会更新:

可以看到:Name列的值已经发生修改,但是UpdatedTime列的值却没有更新。但是我们想要的效果是数据更新的时候,UpdatedTime列的值也随之更新,该怎么办呢?有两种方式解决这个问题。

1、使用计算列

这种方式是对UpdatedTime字段设置使用计算列,代码如下:

using EFCore.Model;using Microsoft.EntityFrameworkCore;namespace EFCore.Data{    ///     /// 数据上下文    ///     public class EFDbContext : DbContext    {        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)        {            optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=EFTest;User ID=sa;Password=123456;");        }        public DbSet Blogs { get; set; }        ///         /// 重写OnModelCreating方法,配置映射        ///         ///         protected override void OnModelCreating(ModelBuilder modelBuilder)        {            // 配置表名映射            modelBuilder.Entity().ToTable("Blog");            // 将表名长度设置为250会报错,表名最大长度限制为128            //var tableName = string.Join("", Enumerable.Repeat("t", 250).ToArray());            //modelBuilder.Entity().ToTable(tableName);            modelBuilder.Entity(p =>            {                // 配置CreatedTime字段                p.Property(t => t.CreatedTime)                // 设置列的类型是DATETIME                 .HasColumnType("DATETIME")                 // 设置列的默认值                 .HasDefaultValueSql("GETDATE()");                //// 配置UpdatedTime字段                //p.Property(t => t.UpdatedTime)                //// 设置列的类型是DATETIME                //.HasColumnType("DATETIME")                //// 设置列的默认值                //.HasDefaultValueSql("GETDATE()");                // 配置UpdatedTime字段                p.Property(t => t.UpdatedTime)                // 设置列的类型是DATETIME                .HasColumnType("DATETIME")                // 设置UpdatedTime字段使用计算列                .HasComputedColumnSql("GETDATE()");            });            // 添加一条种子数据            modelBuilder.Entity().HasData(                new Blog()                 {                    Id=1,                  Name="ef core 3.1.2"                });            base.OnModelCreating(modelBuilder);        }    }}

然后删除数据库,从新开始生成数据库、新增数据、修改数据这三步,我们先看新增数据后的结果:

可以看到,CreatedTime和UpdatedTime这时会有误差,但是误差是秒以内可以接受的。我们在看修改后的结果:

这时就会发现:UpdatedTime列的值就会发生改变了。也会发现,UpdatedTime列的数据类型是计算:

2、重写SaveChanges方法

还有一种方式是重写SaveChanges()方法。

我们首先在实体类库里面定义一个IUpdatedable接口:

using System;namespace EFCore.Model{    public  interface IUpdatedable    {        DateTime UpdatedTime { get; set; }    }}

然后Blog类继承自这个接口:

using System;namespace EFCore.Model{    public  class Blog:IUpdatedable    {        public int Id { get; set; }        public string Name { get; set; }        ///         /// 创建时间        ///         public DateTime CreatedTime { get; set; }        ///         /// 添加时间        ///         public DateTime UpdatedTime { get; set; }    }}

然后在数据上下文类里面重写SaveChanges方法:

public override int SaveChanges(){    var entries = ChangeTracker.Entries().ToList();    var updateEntries = entries.Where(e => (e.Entity is IUpdatedable)    && e.State == EntityState.Modified).ToList();    updateEntries.ForEach(e =>     {        ((IUpdatedable)e.Entity).UpdatedTime = DateTime.Now;    });    return base.SaveChanges();}

同时修改UpdatedTime字段不是计算列,赋默认值:

// 配置UpdatedTime字段p.Property(t => t.UpdatedTime)// 设置列的类型是DATETIME.HasColumnType("DATETIME")// 设置列的默认值.HasDefaultValueSql("GETDATE()");

这种方式就不能使用数据迁移了,要在代码里面调用SaveChanges方法才可以实现:

using EFCore.Data;using EFCore.Model;using System;namespace EFCore.Con{    class Program    {        static void Main(string[] args)        {            Console.WriteLine("Hello World!");            // 实例化数据上下文对象            EFDbContext dbContext = new EFDbContext();            // 生成数据库            bool tfTrue = dbContext.Database.EnsureCreated();            if (tfTrue)            {                Console.WriteLine("数据库创建成功!");            }            else            {                Console.WriteLine("数据库创建失败!");            }            // 查询Id为1的数据            var blog = dbContext.Blogs.Find(1);            // 更改表名称            blog.Name = "entity framework core 3.1.21212";            dbContext.SaveChanges();            Console.ReadKey();        }    }}

数据库效果:

这样也完成了更新。

感谢你能够认真阅读完这篇文章,希望小编分享的"Entity Framework Core如何更新时间映射"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

数据 时间 配置 字段 类型 更新 数据库 生成 方式 方法 上下 上下文 代码 篇文章 长度 同时 时候 种子 最大 接口 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 哈尔滨大商圈互联网科技有限公司 广州紫鲸互联网科技有限公司 科技互联网产品 深圳恒合互联网络科技有限公司 极限挑战互联网科技 农村开互联网科技讲堂 深圳前海聚择互联网科技有限公司 米聚互联网科技南京有限公司排面 燊美集互联网科技有限公司 畅思互联网科技 佛山市翊博互联网络科技有限公司 互联网金融科技名词解释 互联网第三次科技革命特征 雨阳互联网卡科技有限公司 富国互联网金融科技混合基金 互联网风格科技公司名称 互联网科技企业商标注意事项 唐山双旺合互联网科技产业园 安徽九吞吴互联网科技有限公司 互联网高科技绘画 互联网科技公司 湖南永感互联网科技有限公司 互联网和科技技术 科技和互联网公司 北京互联网科技有限公司 阿里巴巴算科技企业还是互联网 企晟互联网信息科技有限公司 图游互联网科技 神州科技互联网有限公司 求路客互联网科技电话
0