【发布时间】: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 是否有理由阻止执行此操作?
【问题讨论】:
-
请改用
Timespan。time列仅包含时间,它不是完整的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