首页 > 解决方案 > 如何在 Linq 中使用 oracle 日期时间而不是客户端日期时间?

问题描述

我想用 Linq 执行如下脚本。

//Oracle script
UPDATE Table1 SET UPDATETIME = SYSDATE WHERE USERID = '1';

//Linq
var updateTbl = DbContext.Table1.Where(x=>x.USERID == "1").FirstOrDefalt();
updateTbl.UPDATETIME = DateTime.Now;
DbContext.SaveChange();

但是我检索sql脚本后发现Linq并没有使用sysdate。

update "Table1"
set "UPDATETIME" = :p0
where ("USERID" = :p1)
-- :p0: '2021/3/4 09:55:07' (Type = DateTime) //DateTime on client instead of Oracle sysdate.
-- :p1: '1' (Type = String, Size = 128)

有些客户端会有错误的日期时间,所以我想用 oracle 日期时间而不是客户端日期时间来保存日期时间。

如何用 Linq 做到这一点?我想执行如下脚本。

update "Table1"
set "UPDATETIME" = :p0
where ("USERID" = :p1)
-- :p0: sysdate (Type = DateTime)
-- :p1: '1' (Type = String, Size = 128)

标签: c#entity-frameworklinq

解决方案


实体框架不会更新集合中的行。首先,检索对象(您的 FirstOrDeault 实现对象),然后修改内存中的对象,最后 EF 为每个修改的对象生成更新语句(在 SaveChanges 方法中)。

由于 updateTbl.UPDATETIME = DateTime.Now 是在内存中执行的,所以不会执行 SQL 代码。更新代码是在值更改后生成的。

如果您需要在不检索对象的情况下执行 SQL,则可以使用 DbContext.Database.ExecuteSqlCommand。这使您可以创建任意或参数化的 SQL,但是,如果您正在修改其他字段,则可能难以维护。

我假设正在运行的应用服务器和数据库服务器不同步,并且想使用数据库服务器时间。你能强制服务器同步吗?

其他选项可能是在每次插入/更新行时更新列的表中使用触发器。


推荐阅读