EF Core ExecuteSqlRaw怎么用 EF Core执行原生增删改命令
技术百科
畫卷琴夢
发布时间:2026-01-20
浏览: 次 ExecuteSqlRaw只返回受影响行数,不返回实体数据;需用参数化查询防SQL注入;不支持结果集,应优先用单条SQL完成查改;需手动处理实体状态和事务。
EF Core 中 ExecuteSqlRaw 是执行原生 SQL 增删改(INSERT/UPDATE/DELETE)语句的常用方法,它**不返回实体数据,只返回受影响行数**,适合做批量操作、复杂更新或绕过 EF 映射限制的场景。
基本用法:执行无参数 SQL
直接传入 SQL 字符串,适用于固定语句、无用户输入的场景(如初始化数据):
context.Database.ExecuteSqlRaw("UPDATE Products SET Price = Price * 1.1 WHERE CategoryId = 5");⚠️ 注意:这种方式**不能防止 SQL 注入**,切勿拼接用户输入!
安全写法:使用参数化查询(推荐)
用

{0} 占位符 + 参数数组,或命名参数(EF Core 5+ 支持):
- 位置参数(兼容旧版):
context.Database.ExecuteSqlRaw("DELETE FROM Orders WHERE Status = {0} AND CreatedAt - 命名参数(更清晰,推荐):
context.Database.ExecuteSqlRaw("UPDATE Users SET IsActive = {0} WHERE Email = {1}", true, "user@example.com");
EF Core 会自动处理参数转义,彻底避免 SQL 注入。
配合 FromSqlRaw 或原始查询做“先查后改”?注意误区
ExecuteSqlRaw 本身**不支持返回结果集**。如果需要“查出一批 ID 再批量更新”,别写成两步手动循环——效率低还易出错。正确做法是:
- 尽量用一条 SQL 完成(例如子查询或 CTE):
context.Database.ExecuteSqlRaw(@"UPDATE Orders SET Processed = 1 WHERE Id IN (SELECT Id FROM Orders WHERE Status = 'Pending' AND CreatedAt - 真需分步,用
FromSqlRaw查 ID 列表再传入参数化 UPDATE(注意参数数量限制,SQL Server 最多 2100 个参数)。
事务与上下文状态管理
ExecuteSqlRaw 运行在当前 DbContext 的数据库连接上,但不会自动触发 EF 的变更跟踪或影响已加载实体的状态。例如:
- 你用
ExecuteSqlRaw更新了数据库中某条记录,但之前已从 EF 加载到内存的对应实体对象,其属性值不会自动刷新; - 若后续调用
SaveChanges(),EF 仍按它自己跟踪的旧值提交——可能覆盖你的原生更新; - 解决办法:
✓ 手动重载实体:context.Entry(entity).Reload();
✓ 或确保原生 SQL 操作前后不混用同一上下文的跟踪实体;
✓ 关键业务建议显式包裹事务:using var transaction = context.Database.BeginTransaction(); ... ExecuteSqlRaw ... SaveChanges ... Commit();
基本上就这些。用对参数化、管住上下文状态、优先单条 SQL 解决问题,ExecuteSqlRaw 就很稳。
# ai
# 加载
# 解决问题
# 最多
# 解决办法
# 适用于
# 不支持
# go
# 循环
# 对象
# 字符串
# 数据库
# var
# delete
# select
# sql
# 行数
# database
# 你用
# 两步
# 参数数组
# using
# sql注入
# 单条
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何用正则与预处理高效拦截带干扰符的恶意域名
- Python集合操作技巧_高效去重解析【教程】
- Win11如何设置自动关机 Win11定时关机命令
- Linux怎么设置磁盘配额_Linux系统Quot
- Mac如何使用听写功能_Mac语音输入打字【效率技
- 如何在 Go 中正确初始化结构体中的 map 字段
- Python正则表达式实战_模式匹配说明【教程】
- mac本地php环境如何开启curl_curl扩展
- c++的位运算怎么用 与、或、异或、移位操作详解【
- Drupal 中渲染节点时出现 HTML 标签嵌套
- 零基础学会Python自动化办公_高效处理Exce
- c++如何获取map中所有的键_C++遍历键值对提
- php删除数据怎么软删除_添加is_del字段标记
- 如何在 ACF 中正确更新嵌套多层 Group 字
- Win11怎么激活Windows10_Win11激
- 如何优化Golang内存分配与GC调度_Golan
- php串口通信波特率怎么选_根据硬件手册设置正确波
- 手机php文件怎么变成mp4_安卓苹果打开php转
- Win10怎么卸载鲁大师_Win10彻底卸载鲁大师
- Mac如何修改Hosts文件?(本地开发与屏蔽网站
- Win10怎样安装Excel数据分析工具_Win1
- c++怎么操作redis数据库_c++ hired
- Python音视频处理高级项目教程_FFmpegP
- php怎么下载安装后无法解析php文件_服务器配置
- windows如何修改文件默认打开方式_windo
- 如何使用Golang安装依赖库_管理模块和第三方包
- MAC怎么一键隐藏桌面所有图标_MAC极简模式切换
- c++怎么使用std::tuple存储多元组数据_
- 如何在Golang中捕获结构体方法错误_Golan
- Win11如何关闭小娜Cortana Win11禁
- php下载安装选zip还是msi格式_两种安装包对
- 如何使用Golang实现跨域请求支持_Golang
- Python文件管理规范_工程实践说明【指导】
- Mac电脑如何恢复出厂设置_Mac抹掉数据并重装系
- PHP 中如何在函数内持久修改引用变量所指向的目标
- Windows10电脑怎么设置虚拟内存_Win10
- Mac如何设置动态壁纸?(让桌面动起来)
- Win11怎么关闭右下角弹窗_Win11拦截系统通
- MAC怎么用连续互通相机里的“桌上视角”_MAC在
- Windows10如何更改鼠标灵敏度_Win10鼠
- Win11局域网共享怎么设置 Win11文件夹网络
- 如何使用Golang实现负载均衡_分发请求到多个服
- Win11屏幕亮度突然变暗怎么解决_自动变暗问题处
- c# 服务器GC和工作站GC的区别和设置
- Win11截图快捷键是什么_Win11自带截图工具
- Win11怎么设置夜间模式_Windows11显示
- Win11触摸板没反应怎么办_开启Win11笔记本
- Win11怎么开启远程桌面连接_Windows11
- c++怎么编写动态链接库dll_c++ __dec
- Windows执行文件被SmartScreen拦截

QQ客服