c# - 如何在 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)
解决方案
实体框架不会更新集合中的行。首先,检索对象(您的 FirstOrDeault 实现对象),然后修改内存中的对象,最后 EF 为每个修改的对象生成更新语句(在 SaveChanges 方法中)。
由于 updateTbl.UPDATETIME = DateTime.Now 是在内存中执行的,所以不会执行 SQL 代码。更新代码是在值更改后生成的。
如果您需要在不检索对象的情况下执行 SQL,则可以使用 DbContext.Database.ExecuteSqlCommand。这使您可以创建任意或参数化的 SQL,但是,如果您正在修改其他字段,则可能难以维护。
我假设正在运行的应用服务器和数据库服务器不同步,并且想使用数据库服务器时间。你能强制服务器同步吗?
其他选项可能是在每次插入/更新行时更新列的表中使用触发器。
推荐阅读
- arrays - Dataweave - 每行对象的对象数组
- java - 使用 Jackson 将 JSON 与包装在字符串中的 JSON 反序列化
- c# - 如何关闭未实现 IDisposable 的 Singleton 服务
- python - xpath 中的以下同级未按预期工作
- jquery - Rails Uncaught TypeError: $(...).modal 不是函数
- javascript - React/Redux:需要用 Redux 构建一个 React 组件,根据初始下拉选择动态生成额外的下拉列表
- reactjs - 如何使用 React Native 在 iOS、Android 和 Web 之间创建单个应用程序
- c++ - 在 linux 中使用 g++ 编译关于 std::basic_ios 的错误
- python - "errorMessage": "无法导入模块 'UpdateHost_Python'"
- php - php递归函数将嵌套{}分隔的字符串转换为数组