如何使实体框架截断映射到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
值的时间部分?
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'