c# - 如果我使用其中的许多而不是一个,EFCore DbContext 会更快吗?为什么?
问题描述
语境:
我正在从 Access 迁移到 SQL Server。这是一个复杂的迁移并且运行得相当频繁——所以我将它集成到网站中,这样用户可以在需要时偶尔自己进行。
怪异:
所以我最初决定SaveChanges()
在每个区域的末尾使用一个上下文进行常规操作。
当它达到 ~ 60k 插入时,需要很长时间才能保存。
好吧,我想,我会SaveChanges
在每个条目之后运行。花了很长时间。长得离谱。
好的,所以我决定尝试SaveChangesAsync
,但根本无法让它工作。我愿意给这个区域它自己的Dbcontext
,只是让它保存在后台,在结局之前我会等待它。无法让它发挥作用。最初它会抛出一个错误,然后它根本不会保存数据。
好的,所以下一步是尝试赋予此方法自己的DbContext
. 像梦想一样工作。
然后我给了每种方法(总共大约 13 种)他们自己的DbContext
. 一切都非常快。
DbContext
所以我的问题是: one ,有 13 个SaveChanges()
电话和 13DbContexts
有 13 个电话有什么区别SaveChanges()
?
你跑完后有什么东西SaveChanges()
我可以清理吗?还是我应该简单地选择许多DbContext
?我只是试图避免每次都打开一个新的连接来节省那一点时间,但这并不是什么大问题,但我仍然不明白为什么会这样。有人可以教育我吗?
解决方案
运行 SaveChanges() 后是否有一些我可以清理的东西?
是的。更改跟踪器。默认情况下,DbContext 将保留所有加载的实体,在这种情况下,加载额外的实体和识别更改的实体会变得越来越昂贵。
所以使用多个 DbContext 实例,或者在 SaveChanges() 之后分离所有实体,如这里的答案How do I clear tracked entities in entity framework ;
推荐阅读
- javascript - 如何在 Typescript 中展平嵌套对象?
- seo - CLS 网络核心生命值让我抓狂
- apache - Lightsail 和 Letsencrypt - 不从 htdocs 文件夹渲染
- sql - 计算日期之间的寄存器
- java - 在 Spring Boot 中测试过滤器的虚拟 ApplicationContext
- python-3.x - DRF,在 perform_authentication() 中,request.user 的测试仅在运行多个测试时设置为空字符串
- reactjs - 无法摆脱警告:在测试 RTL 期间对未安装的组件做出反应状态更新
- r - 检查一系列日期是否在一系列不同的时间间隔内
- python - 如何使用类 ttk.Style 设置框架的背景?
- imagemagick - ImageMagick 平铺输出两个文件