注册
|
登录
发帖
热搜
活动
交友
discuz
论坛
BBS
翼度工具
翼度网址导航
开发工具
Linux命令速查
网页设计配色表
在线制作icon
颜色代码选取器
翼度科技
»
论坛
›
编程开发
›
.net
›
查看内容
返回列表
发新帖
.NET使用EF批量插入数据,一行代码性能飙升!
监守自盗
监守自盗
当前离线
积分
39
13
主题
13
帖子
39
积分
新手上路
新手上路, 积分 39, 距离下一级还需 11 积分
新手上路, 积分 39, 距离下一级还需 11 积分
积分
39
发消息
显示全部楼层
背景
小编最近接到一个任务,批量获取内部网站用TXT生成的日志,在闲时把日志插入到MySql数据库做分析。为了快速开发小编选择了Entity Framework Core,很快开发完成了。测试数据不是很多,批量插入数据很快完成,效率很高。但是部署到线上问题来了,最开始也挺快,越到后面越慢,慢的无法接受。于是查询了一下官网和某度,只需加一句代码就可以让EF批量插入数据飙升。
代码示例
开始的批量添加代码:
public async void AddRangeAsync(List<T> entities)
{
await _dbContext.AddRangeAsync(entities);
await _dbContext.SaveChangesAsync();
}
复制代码
在以上方法增加一行,如下:
public async void AddRangeAsync(List<T> entities)
{
//批量添加需要将AutoDetectChangesEnabled给位false
_dbContext.ChangeTracker.AutoDetectChangesEnabled = false;
await _dbContext.AddRangeAsync(entities);
await _dbContext.SaveChangesAsync();
}
复制代码
原理
微软的解释:“AutoDetectChangesEnabled默认值为 true。这可确保上下文在执行操作(例如 SaveChanges() 或返回更改跟踪信息)之前了解对跟踪实体实例所做的任何更改。如果禁用自动检测更改, DetectChanges() 则必须确保在修改实体实例时调用 。如果不这样做,可能会导致某些更改在返回或返回过时的更改跟踪信息期间 SaveChanges() 无法持久保存”
[1]
。
这是啥意思呢?ChangeTracker的AutoDetectChangesEnabled属性是Entity Framework中的一个属性,用于控制是否自动检测实体的更改。默认情况下,AutoDetectChangesEnabled属性的值为true,即自动检测更改。每次对实体进行更改(添加、删除、更新)时,Entity Framework会自动检测这些更改,并将其标记为“已更改”。这样,在调用SaveChanges方法时,Entity Framework会自动将这些更改应用到数据库中。
当AutoDetectChangesEnabled属性的值为true时,将对EF的性能造成一定的影响,尤其是批量插入数据。对于插入操作,无论AutoDetectChangesEnabled的值为true还是false,都可以成功插入数据。因为插入操作本身就是一种新增操作,无需进行实体的更改检测。所以在批量插入时,建议把AutoDetectChangesEnabled设置为false。
设置为false具体对操作的数据有没有影响呢?答案是肯定的,分情况。如果插入数据后有上下文操作,那么上下文不会自动更新实体的状态,如果没有后续操作可以忽略。这就需要手动调用DetectChanges方法或将实体状态设置为“已更改”才能使上下文与数据库同步。建议批量插入数据结束时,把AutoDetectChangesEnabled的值改为true。
**结语
**
本文讲述了.NET用EF批量插入数据,改进性能的简单方法。当然还有很多方法,比如可以使用EF批量添加扩展,可以在EF中执行SQL插入语句,还可以用
EF执行存储过程的方式批量添加
(SQL Server实验过,MySql未实验)等,大家还有啥好方法可以留言。日志分析建议大家用mangodb或者ES等数据库,本案例只是临时数据分析。希望本文对你有所收获,欢迎留言或者吐槽。
参考资料
[1]
https://learn.microsoft.com/zh-cn/dotnet/api/microsoft.entityframeworkcore.changetracking.changetracker.autodetectchangesenabled?view=efcore-7.0#microsoft-entityframeworkcore-changetracking-changetracker-autodetectchangesenabled
来源公众号:DotNet开发跳槽
复制代码
来源:
https://www.cnblogs.com/xbhp/archive/2023/07/10/17540769.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
上一篇:
.NET使用EF批量插入数据,一行代码性能飙升!
下一篇:
.NET使用EF批量插入数据,一行代码性能飙升!
发表于 2023-7-10 15:49:00
举报
回复
使用道具
分享
返回列表
发新帖
本版积分规则
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
快速回复
快速回复
返回顶部
返回顶部
返回列表
返回列表