如果我使用许多而不是一个,EFCore DbContext 会更快吗?为什么?
EFCore DbContext faster if I use many of them instead of one? Why?
上下文:
我正在从 Access 迁移到 SQL Server。这是一个复杂的迁移,而且 运行 相当频繁——所以我将它集成到网站中,这样用户可以在需要时偶尔自己做。
怪异:
所以我最初决定在每个区域的末尾使用一个上下文进行常规 SaveChanges()
。
当它达到 ~ 60k 插入时,需要很长时间才能保存。
好吧,我想,我会在每次输入后 运行 SaveChanges
。花了很长时间。太长了。
好的,所以我决定尝试 SaveChangesAsync
,但就是无法正常工作。我愿意给这个区域它自己的 Dbcontext
并让它保存在后台,在结局之前我会等待它。无法让它工作。最初它会抛出一个错误,然后它根本不会保存数据。
好的,下一步就是尝试给这个方法赋予它自己的 DbContext
。像梦一样工作。
然后我给了每个方法(总共大约 13 个)它们自己的 DbContext
。一切都很快。
所以我的问题是:一个 DbContext
有 13 个 SaveChanges()
调用和 13 个 DbContexts
有 13 个 SaveChanges()
调用有什么区别?
在你 运行 SaveChanges()
之后有什么东西可以清理吗?或者我应该简单地选择许多 DbContext
吗?我只是想避免每次都打开一个新连接以节省那一点时间,但这并不是什么大问题,但我仍然缺乏理解为什么这是案子。有人可以教我吗?
Is there something left behind after you run SaveChanges() that I could clean?
是的。更改跟踪器。默认情况下,DbContext 将保留所有已加载的实体,在这种情况下,加载额外实体和识别已更改实体的成本会逐渐增加。
因此使用多个 DbContext 实例,或在 SaveChanges() 之后分离所有实体,如此处的答案How do I clear tracked entities in entity framework;
上下文:
我正在从 Access 迁移到 SQL Server。这是一个复杂的迁移,而且 运行 相当频繁——所以我将它集成到网站中,这样用户可以在需要时偶尔自己做。
怪异:
所以我最初决定在每个区域的末尾使用一个上下文进行常规 SaveChanges()
。
当它达到 ~ 60k 插入时,需要很长时间才能保存。
好吧,我想,我会在每次输入后 运行 SaveChanges
。花了很长时间。太长了。
好的,所以我决定尝试 SaveChangesAsync
,但就是无法正常工作。我愿意给这个区域它自己的 Dbcontext
并让它保存在后台,在结局之前我会等待它。无法让它工作。最初它会抛出一个错误,然后它根本不会保存数据。
好的,下一步就是尝试给这个方法赋予它自己的 DbContext
。像梦一样工作。
然后我给了每个方法(总共大约 13 个)它们自己的 DbContext
。一切都很快。
所以我的问题是:一个 DbContext
有 13 个 SaveChanges()
调用和 13 个 DbContexts
有 13 个 SaveChanges()
调用有什么区别?
在你 运行 SaveChanges()
之后有什么东西可以清理吗?或者我应该简单地选择许多 DbContext
吗?我只是想避免每次都打开一个新连接以节省那一点时间,但这并不是什么大问题,但我仍然缺乏理解为什么这是案子。有人可以教我吗?
Is there something left behind after you run SaveChanges() that I could clean?
是的。更改跟踪器。默认情况下,DbContext 将保留所有已加载的实体,在这种情况下,加载额外实体和识别已更改实体的成本会逐渐增加。
因此使用多个 DbContext 实例,或在 SaveChanges() 之后分离所有实体,如此处的答案How do I clear tracked entities in entity framework;