ASP.NET Core下EF Core Code First如何获取SQL Server当前时间
在ASP.NET Core EF Core Code First中获取SQL Server当前时间的方法
下面是几种实用的实现方式,覆盖建表默认值、直接查询SQL时间、LINQ中调用SQL函数等场景:
1. 建表时设置默认值(自动填充SQL时间)
如果希望实体新增时自动获取SQL Server的当前时间,可以在Code First的实体配置中,给对应属性设置SQL默认值GETDATE():
实体类定义
public class MyEntity { public int Id { get; set; } // 新增时自动填充SQL服务器时间 public DateTime CreateTime { get; set; } // 其他业务属性 }
DbContext配置
在OnModelCreating方法中配置属性的默认值SQL:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<MyEntity>() .Property(e => e.CreateTime) .HasDefaultValueSql("GETDATE()"); }
这样当你新增MyEntity实例且不赋值CreateTime时,SQL Server会自动用当前时间填充该字段。
如果需要每次更新实体时自动刷新时间,可以改用计算列:
modelBuilder.Entity<MyEntity>() .Property(e => e.LastUpdateTime) .HasComputedColumnSql("GETDATE()");
2. 直接查询SQL Server当前时间
如果你需要在业务代码中主动获取SQL Server的当前时间,可以直接执行SQL查询:
// EF Core 3.0+ 使用SqlQuery var currentSqlTime = _context.Database.SqlQuery<DateTime>("SELECT GETDATE()").FirstOrDefault(); // 旧版本(EF Core 2.x)使用FromSql var currentSqlTime = _context.Set<DateTime>().FromSql("SELECT GETDATE()").FirstOrDefault();
3. 在LINQ查询中调用SQL的GETDATE()函数
可以把SQL的GETDATE()映射成EF Core可识别的方法,这样就能在LINQ查询中直接使用:
步骤1:在DbContext中定义函数
public class MyDbContext : DbContext { // 映射SQL的GETDATE()函数 [DbFunction("GETDATE", "")] public static DateTime GetSqlServerCurrentTime() { // 仅用于EF Core查询翻译,实际不会执行 throw new NotImplementedException(); } // DbSet和其他配置... }
步骤2:注册函数
在OnModelCreating中注册该函数:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.HasDbFunction(() => MyDbContext.GetSqlServerCurrentTime()); }
步骤3:在LINQ中使用
现在可以直接在LINQ查询里调用,EF Core会自动翻译成SQL的GETDATE():
var recentEntities = _context.MyEntities .Where(e => e.CreateTime >= MyDbContext.GetSqlServerCurrentTime().AddDays(-7)) .ToList();
内容的提问来源于stack exchange,提问作者Dung
相关产品推荐
相关产品推荐

