首页 > 解决方案 > 如果我使用其中的许多而不是一个,EFCore DbContext 会更快吗?为什么?

问题描述

语境:

我正在从 Access 迁移到 SQL Server。这是一个复杂的迁移并且运行得相当频繁——所以我将它集成到网站中,这样用户可以在需要时偶尔自己进行。

怪异:

所以我最初决定SaveChanges()在每个区域的末尾使用一个上下文进行常规操作。

当它达到 ~ 60k 插入时,需要很长时间才能保存。

好吧,我想,我会SaveChanges在每个条目之后运行。花了很长时间。长得离谱。

好的,所以我决定尝试SaveChangesAsync,但根本无法让它工作。我愿意给这个区域它自己的Dbcontext,只是让它保存在后台,在结局之前我会等待它。无法让它发挥作用。最初它会抛出一个错误,然后它根本不会保存数据。

好的,所以下一步是尝试赋予此方法自己的DbContext. 像梦想一样工作。

然后我给了每种方法(总共大约 13 种)他们自己的DbContext. 一切都非常快。

DbContext所以我的问题是: one ,有 13 个SaveChanges()电话和 13DbContexts有 13 个电话有什么区别SaveChanges()

你跑完后有什么东西SaveChanges()我可以清理吗?还是我应该简单地选择许多DbContext?我只是试图避免每次都打开一个新的连接来节省那一点时间,但这并不是什么大问题,但我仍然不明白为什么会这样。有人可以教育我吗?

标签: c#entity-framework-coreasp.net-core-3.1

解决方案


运行 SaveChanges() 后是否有一些我可以清理的东西?

是的。更改跟踪器。默认情况下,DbContext 将保留所有加载的实体,在这种情况下,加载额外的实体和识别更改的实体会变得越来越昂贵。

所以使用多个 DbContext 实例,或者在 SaveChanges() 之后分离所有实体,如这里的答案How do I clear tracked entities in entity framework ;


推荐阅读