【问题标题】:C# Datetime insert SQL Server value with microseconds preciseC# Datetime 以微秒为单位插入 SQL Server 值
【发布时间】:2020-12-07 09:06:46
【问题描述】:

我正在使用 .Net Core 2.2 和实体框架。我需要在 SQL Server 中插入一些数据。

在 C# 中我使用 DateTime 数据类型,在 SQL Server 中我使用 datetime2(6) - 默认值为:(sysdatetime())

例如我的对象看起来像:

public partial class Contact
{
    public int Id { get; set; } 
    public string Name { get; set; } 
    public DateTime CreatedTime { get; set; } 
}

如果我在创建对象时将 CreatedTime 保留为 null,并将其留给 SQL Server 使用默认值 (sysdatetime()),我将得到类似:2020-05-19 09:31:12.383593 在数据库中。

据我了解,DateTime 数据类型本身已经精确到微秒,但是,如果我为 CreatedTime 属性设置一个值,例如:

obj.CreatedTime = DateTime.Now.AddTicks(123);
Console.WriteLine(obj.CreatedTime.ToString("yyyy-MM-dd HH:mm:ss.ffffff"));

我可以在控制台中看到值,应该是 2020-08-18 07:42:52.131102 。但是当通过 EntityFramwork 插入该 obj 时,数据库中的值将只是毫秒: 2020-08-18 07:42:52.131000 。它看起来像 EntityFramework 以某种方式仅以毫秒精度传递 DateTime?

非常感谢您的支持。

【问题讨论】:

  • 您需要使用 DateTime2 日期类型modelBuilder.Properties<DateTime>().Configure(c => c.HasColumnType("datetime2"));modelBuilder.Entity<SomeEntiity>().Property(f => f.SomeDate).HasColumnType("datetime2");
  • 我的猜测是,在某个地方,EF 一定是在推断 SQL 数据类型,但它弄错了。您可能想要使用数据注释:[Column(TypeName = "DateTime2(6)")](尽管official documentation 声称在面向 SQL Server 时 DateTime 的默认映射是 DateTime2(7))
  • 谢谢大家!我真的很感谢你的帮助! @Michael Randall 非常感谢您解决了我的问题!你能把它作为答案发布吗?我会把它标记为正确答案!
  • @CodeCaster - 是的,但如果他需要的值比数据库以日期时间格式保存的更精确,那么值得考虑(也许他不在这里,如果 DateTime2 会覆盖它,那么没关系,这只是我之前必须考虑的)

标签: c# sql-server entity-framework datetime


【解决方案1】:

您可能需要强制 EF 使用精度为 100ns 的 SQL Server DateTime2(7) max/default 数据类型 (YYYY-MM-DD hh:mm:ss.0000000),您可以通过多种方式执行此操作

全球

modelBuilder
  .Properties<DateTime>()
  .Configure(c => c.HasColumnType("datetime2"));

明确

modelBuilder
  .Entity<SomeEntiity>()
  .Property(f => f.SomeDate)
  .HasColumnType("datetime2"); 

或通过属性

[Column(TypeName = "DateTime2(7)")]

【讨论】:

    猜你喜欢
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多