Asp.net core 在Entity Framework Core 3.1中为SQL时间列使用DateTime

Asp.net core 在Entity Framework Core 3.1中为SQL时间列使用DateTime,asp.net-core,entity-framework-core,Asp.net Core,Entity Framework Core,有没有办法让EntityFramework核心允许您对SQL时间列使用DateTime?SQL Server允许您使用DateTime设置时间列值,但当您尝试配置Entity Framework Core来执行此操作时,它会在编译模型时引发异常,表示数据库提供程序不支持该数据类型 此代码引发异常 public void Configure(EntityTypeBuilder<Category> builder) { ... builder.Property<Sy

有没有办法让EntityFramework核心允许您对SQL时间列使用DateTime?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
}
public void配置(EntityTypeBuilder)
{
...
builder.Property(x=>x.StartTime).HasColumnName(@“StartTime”).HasColumnType(@“time”).IsRequired()
//HasColumnType与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
}
public void配置(EntityTypeBuilder)
{
...
builder.Property(x=>x.StartTime).HasColumnName(@“StartTime”).HasColumnType(@“datetime”).IsRequired()
//HasColumnType与SQL中定义的类型不匹配
}

在SQL允许的情况下,EF Core阻止这样做有什么原因吗?

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

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

改用
Timespan
time
列只包含一天中的时间,它不是一个完整的
datetime
,因此它不应该映射到
datetime
我更喜欢避免时间跨度,它只是处理一天中的时间的一种糟糕的数据类型,您需要一个自定义绑定器来映射来自客户端的日期时间值。。。SQL Server支持使用DateTime设置时间字段,那么为什么实体框架会任意阻止该功能呢?因为SQL Server根本不支持这一点。传统的
datetime
类型有很多怪癖-例如,您可以添加两个
datetime
值并在4040中获取日期。这并不意味着这是个好主意。这就是为什么SQL Server不允许在
time
和较新的类型(如
datetime2
)之间进行隐式转换的原因。至于糟糕的类型,那就是
DateTime
。一天中的时间根本没有日期组件,那么
DateTime
应该是什么意思呢?当您只有
DateTime
值时,如何比较时间?虽然
Timespan
可能不限于24小时,但它比
DateTime
要好得多。也不需要定制活页夹-
time
映射到
Timespan
,而不是
DateTime
,最后,
time
映射到EF中的
Timespan