如何使实体框架截断映射到SQL日期类型的DateTime值的时间部分

本文关键字:类型 日期 DateTime 时间部 SQL 实体 何使 框架 映射 | 更新日期: 2023-09-27 18:25:00

我有一个基于现有数据库的实体框架模型(也称为"数据库中的代码优先")。数据库包含一个movies表,该表包含以下列:

id int IDENTITY(1,1) NOT NULL
name nvarchar(50) NOT NULL
releaseDate date NOT NULL

请注意,releaseDate列具有SQL数据类型date,因此不包含时间部分。实体框架将此数据类型映射到不包含时间部分的CLR DateTime类型。

现在我要向数据库中添加一个新的movie。这里的重要部分是,我的新movie在其releaseDate属性中指定了一些时间部分:

var movie = new movie
{
    name = "Hello World",
    releaseDate = DateTime.Now // releaseDate contains time portion
};
using (var context = new Model())
{
    context.movies.Add(movie);
    context.SaveChanges();
}
Console.WriteLine(movie.id);          // id field was updated automatically
Console.WriteLine(movie.releaseDate); // releaseDate was not updated and still contains time portion

现在,我的新movie存储在数据库中,很明显,releaseDate的时间部分被忽略了——数据库中只存储了日期部分。然而,如果我看一下movie.releaseDate,时间部分仍然存在。

我想知道,这种行为有多一致?为什么实体框架不更新releaseDate以将其时间部分设置为00:00:00?既然它用自动生成的主键值自动填充了movie.id属性,为什么它不为releaseDate属性做类似的事情?

是否有任何方法可以强制实体框架截断映射到SQL date类型的DateTime值的时间部分?

如何使实体框架截断映射到SQL日期类型的DateTime值的时间部分

EF只更新自动生成的主键。它不会加载回整个实体。

如果您运行一个SQl服务器跟踪,您会看到它执行INSERT,然后只执行主键的SELECT。在下面的例子中,我有一个订单表。

exec sp_executesql N'INSERT [Purchasing].[Orders]([ClientCode], [OrderDate])
VALUES (@0, @1)
SELECT [OrderId]
FROM [Purchasing].[Orders]
WHERE @@ROWCOUNT > 0 AND [OrderId] = scope_identity()',N'@0 nvarchar(max) ,@1 datetime2(7)',@0=N'X',@1='2015-11-30 15:11:36.4326217'
相关文章: