【问题标题】:Using DateTime for a SQL Time Column in Entity Framework Core 3.1在 Entity Framework Core 3.1 中将 DateTime 用于 SQL 时间列
【发布时间】:2020-06-30 16:35:02
【问题描述】:

有没有办法让 Entity Framework Core 允许您将 DateTime 用于 SQL 时间列? SQL Server 允许您使用 DateTime 设置时间列值,但是当您尝试配置 Entity Framework Core 来执行此操作时,它会在编译模型时抛出异常,指出数据库提供程序不支持该数据类型。

这段代码抛出异常

public void Configure(EntityTypeBuilder<Category> builder)
{
    ...
    builder.Property<System.DateTime>(x => x.StartTime).HasColumnName(@"StartTime").HasColumnType(@"time").IsRequired() 
    // HasColumnType matches the type defined in SQL
}

这段代码工作正常,但我宁愿保持 HasColumnType 准确,这样它就不会修改数据库以使用 DateTime 而不是 Time...

public void Configure(EntityTypeBuilder<Category> builder)
{
    ...
    builder.Property<System.DateTime>(x => x.StartTime).HasColumnName(@"StartTime").HasColumnType(@"datetime").IsRequired()
    // HasColumnType does not match the type defined in SQL
}

在 SQL 允许的情况下,EF Core 是否有理由阻止执行此操作?

【问题讨论】:

  • 请改用Timespantime 列仅包含时间,它不是完整的 datetime,因此它不应映射到 DateTime
  • 我更喜欢避免使用 TimeSpan,它只是一种用于处理时间的糟糕 DataType,您需要一个自定义活页夹来映射来自客户端的日期时间值......并且 SQL Server 支持设置时间带有 DateTime 的字段,那么为什么 Entity Framework 会任意阻止该功能呢?。
  • 因为 SQL Server 完全支持。旧的 datetime 类型有很多怪癖 - 例如,您可以添加两个 datetime 值并获取 4040 中的日期。这并不意味着这是一个好主意。这就是为什么 SQL Server不允许 允许在 time 和像 datetime2 这样的新类型之间进行隐式转换
  • 至于可怕的类型,DateTime 太可怕了。 Time-of-Day 根本没有日期组件,那么DateTime 应该是什么意思?当你只有DateTime 值时,你怎么能比较时间呢?虽然 Timespan 可能不限于 24 小时,但它比 DateTime很多。也不需要自定义活页夹 - time 映射到 Timespan,而不是 DateTime
  • 最后,time 映射到 EF 中的Timespan

标签: asp.net-core entity-framework-core


【解决方案1】:

我最终通过转换解决了这个问题

builder.Property<DateTime>("StartTime").HasColumnName(@"StartTime").HasColumnType(@"time").IsRequired().HasConversion(v => v.TimeOfDay, v => DateTime.Now.Date.Add(v));

【讨论】:

    猜你喜欢
    • 2021-11-08
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 2022-07-04
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多