【问题标题】:Storing DateTimeOffset value without milliseconds in SQL Server using EF Core使用 EF Core 在 SQL Server 中存储 DateTimeOffset 值,无需毫秒
【发布时间】:2020-09-08 15:04:46
【问题描述】:

假设我创建了一个像这样的DateTimeOffset 值:

var dt = DateTimeOffset.UtcNow;

我想使用 EF Core 代码优先将此值存储在 SQL Server 中。如何删除毫秒部分,使存储在 SQL Server 中的值变为 2020-09-08 14:51:00 +00:00 而不是 2020-09-08 14:51:00.4890984 +00:00

【问题讨论】:

  • 我不了解 EF 核心,但在 SQL Server 中,您可以将列定义为 DateTimeOffset(0),这意味着没有小数秒。
  • 正如 Zohar 所说,您应该通过指定 DateTimeOffset(0) 类型来配置模型上的属性,或者通过属性,或者通过流利的配置
  • 谢谢。我是通过fluent api配置的。
  • 随意发布解决方案作为自我回答,以便其他用户可以从您的体验中受益。

标签: c# sql-server .net-core entity-framework-core


【解决方案1】:

我同意@Zohar Peled 的观点。按应有的方式定义数据。

除此之外,在 c# 中你可以用这种方式截断日期:

dt.AddTicks( - (dt.Ticks % dt.TicksPerMilliseconds));

this post 有更通用的方法。

【讨论】:

  • 感谢您的回复和参考。我最终使用 Zohar/ESG 的方法在数据库级别进行配置。
【解决方案2】:

一个简单的方法是使用value converter

代码可能如下所示(使用来自How to truncate milliseconds off of a .NET DateTime 的答案作为实际转换逻辑):

public class YourContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<YourEntity>()
            .Property(e => e.YourProperty)
            .HasConversion(
                v => v.AddTicks(-(dateTime.Ticks % TimeSpan.TicksPerSecond));,
                v => v);
    }
}

当然,您也可以显式定义然后重用值转换器,还可以通过ModelBuilder 遍历实体及其属性,将其应用于特定类型的所有属性,例如“DateTimeOffset”。

【讨论】:

    【解决方案3】:

    基于使用数据属性的@Zohar 建议:

        [Column(TypeName = "datetimeoffset(0)")]
        public DateTimeOffset Date { get; set; }
    

    【讨论】:

      猜你喜欢
      • 2010-09-16
      • 1970-01-01
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 2021-12-16
      相关资源
      最近更新 更多