gpt4 book ai didi

c# - 与 ObjectContext 相比,为什么在 EF 4.1 中插入实体这么慢?

转载 作者:IT王子 更新时间:2023-10-29 03:39:12 25 4
gpt4 key购买 nike

基本上,我在一个事务中插入 35000 个对象:

using(var uow = new MyContext()){
for(int i = 1; i < 35000; i++) {
var o = new MyObject()...;
uow.MySet.Add(o);
}
uow.SaveChanges();
}

这需要永远!如果我使用基础 ObjectContex t (通过使用 IObjectAdapter ),它仍然很慢,但需要大约 20 秒。看起来像 DbSet<>正在做一些线性搜索,这需要大量的时间...

还有其他人看到这个问题吗?

最佳答案

正如 Ladislav 在评论中指出的那样,您需要禁用自动更改检测以提高性能:

context.Configuration.AutoDetectChangesEnabled = false;

此更改检测在 DbContext API 中默认启用。

DbContext 的行为与 ObjectContext API 如此不同的原因是 DbContext API 的更多函数将调用 DetectChanges 在启用自动更改检测时内部比 ObjectContext API 的函数。

Here您可以找到默认调用 DetectChanges 的那些函数的列表。它们是:

  • AddAttachFindLocalRemove 成员在 DbSet
  • DbContext 上的 GetValidationErrorsEntrySaveChanges 成员
  • DbChangeTracker 上的Entries 方法

特别是 Add 调用 DetectChanges,这会导致您遇到的性能不佳。

与此形成对比的是,ObjectContext API 仅在 SaveChanges 中自动调用 DetectChanges,而在 AddObject 中则不会,并且上面提到的其他相应方法。这就是 ObjectContext默认性能更快的原因。

为什么他们在那么多的函数中引入这个默认的DbContext中的自动变化检测?我不确定,但似乎禁用它并在适当的点手动调用 DetectChanges 被视为 advanced and can easily introduce subtle bugs into your application so use [it] with care .

关于c# - 与 ObjectContext 相比,为什么在 EF 4.1 中插入实体这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5943394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com