C# 如何在Linq中使用oracle datetime而不是客户端datetime?

C# 如何在Linq中使用oracle datetime而不是客户端datetime?,c#,entity-framework,linq,C#,Entity Framework,Linq,我想用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(); 但

我想用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)
某些客户端的datetime错误,因此我希望使用oracle datetime而不是客户端datetime保存datetime

如何与Linq合作? 我想执行下面的脚本

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

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

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

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

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


另一个选项可能是在表中使用触发器,每次插入/更新行时都会更新列。

我从未使用过Oracle,您也没有明确表示,但我假设这是在Entity Framework中(特别是在您提到DbContext之后),那么您使用的是正确的EF提供程序吗?它通常处理从LINQ到使用的任何底层DB命令的转换。我可能完全偏离了基准,但只是我的非谷歌思维。是的,我想用实体框架插入sysdate。