强制实体框架使用 datetime 而非 datetime2

Posted

技术标签:

【中文标题】强制实体框架使用 datetime 而非 datetime2【英文标题】:Enforce Entity Framework to use datetime than datetime2 【发布时间】:2018-07-02 21:08:55 【问题描述】:

我们有 EF 6.1,它在执行 LINQ to SQL 查询时将所有 .NET 日期时间字段转换为 datetime2(SQL),这在某些情况下由于日期比较而失败。有没有一种方法可以强制 EF 使用 datetime 而不是 datetime2。 DB 中的 FYI 列是日期时间。我已经看到强制所有日期时间使用 datetime2 的答案,但找不到任何将日期时间保持为日期时间的东西。 EF 将 datetime 转换为 datetime2 的任何特殊原因。

为了更清楚地说明,在 DB 列中是 Datetime,C# 属性被声明为 datetime。当 EF 将 LINQ 转换为 SQL 查询时,它将特定的日期时间字段作为 datetime2 而不是 datetime 发送。列 Edate 和 Pdate 是日期时间,我传递了一个带有日期时间值的过滤条件,但是当我在分析器中看到它时,它被转换为 datetime2。

   exec sp_executesql N'SELECT TOP (1) 
[Project1].[ID] AS [ID]    
FROM ( SELECT 
    [Extent2].[ID] AS [ID]        
    FROM  [DBO].[TableB] AS [Extent1]
    INNER JOIN [DBO].[TableA] AS [Extent2] ON [Extent1].[ID] = [Extent2].[ID]
    WHERE ([Extent2].[EDate] <= @p__linq__1) AND ([Extent1].[Pdate] > @p__linq__2)
)  AS [Project1]
ORDER BY [Project1].[DateP] DESC',N'@p__linq__1 datetime2(7),@p__linq__2 datetime2(7)',
@p__linq__1='2018-06-24 16:43:34.7830000',@p__linq__2='2018-06-24 16:43:34.7830000'

谢谢, 单位

【问题讨论】:

How do I force Entity Framework to use datetime instead of datetime2, during DateTime comparison?的可能重复 Datetime2 是比 DateTime 更好的数据类型。其实you shouldn't use DateTime again, ever. @WoIIe 谢谢正如我之前所说,那篇特定的文章谈到从 datetime 到 datetime2 的强制执行,在我的情况下,我们希望将 datetime 保留到 datetime 并且不让 EF 使用 datetime2。 EF 6 将 DateTime 映射到 SQL Server 日期时间,因此您的问题可能有所不同。 BTW datetime2 并不比 datetime 好(因为 float(53) 并不比 real 好)。 @bubi DateTime2 isDateTime 好,这就是原因 1:它(可以)使用更少的存储空间。 2:DateTime 有一个错误,隐式转换字符串文字格式yyyy-MM-dd HH:mm:ss,而DateTime2 没有。 3. if 可以有更高(或更低)的精度。 4. 支持更大的日期范围(1753年之前的日期) 【参考方案1】:

您需要安装 Nuget 包:Microsoft.EntityFrameworkCore.SqlServer。安装后,您可以在属性中使用 HasColumnType("datetime")。 :)

【讨论】:

以上是关于强制实体框架使用 datetime 而非 datetime2的主要内容,如果未能解决你的问题,请参考以下文章

mybatis 怎么在 sql的datetime 和 实体类的date做比较

首先在实体框架代码中使用搜索字符串搜索 DateTime

可以使用实体框架迁移将 DateTime 字段默认为 GETDATE() 吗?

实体框架并发令牌 DateTime 类型的问题

实体框架未声明 datetime.now 为空

如何使用 .Include 查询实体框架 6 强制外部联接