Asp.net core 在Entity Framework Core 3.1中为SQL时间列使用DateTime
有没有办法让EntityFramework核心允许您对SQL时间列使用DateTime?SQL Server允许您使用DateTime设置时间列值,但当您尝试配置Entity Framework Core来执行此操作时,它会在编译模型时引发异常,表示数据库提供程序不支持该数据类型 此代码引发异常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
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
。