将对象添加到实体框架上下文大约需要1.5秒

本文关键字:5秒 上下文 添加 对象 实体 框架 | 更新日期: 2023-09-27 18:29:24

我正在寻找为什么会出现这种情况,或者我可以加快速度的方法。

我基本上是用类似的代码构造一个对象

(伪代码)

Person p = new Person();
Address a = new Address() { ... properties set here ... };
Employer e = new Employer() { ... properties set here ... };
// etc.
p.Employer = e;
p.Address = a;
//etc.

最后:

_context.Person.Add(p);

当我分析代码时,人的结构需要0ms,这是闪电般的快。然而,当我把这个人添加到上下文中时,大约需要1500米。这可能与约束检查有关吗?数据库相当大,尽管它没有加载到内存中,或者在执行Add时不应该接触数据库。

只有当我做_context.SaveChanges()时,才应该写它。

有什么提高速度的建议吗?

编辑:Benchmark是这样做的:(sw是new Stopwatch()

sw.Restart();
context.Person.Add(p);
Console.WriteLine("Person added to context: " + sw.ElapsedMilliseconds + "ms");

编辑2:绘图变厚。

当我加载大量的人并将他们添加到数据库中时,我首先要做的操作之一是查看这个人是否已经存在于数据库中。出于速度原因,我将Person.PersonId的完整列表拉到一个哈希表中,并检查要插入的每个记录。

如果这个人已经存在于列表中,我会将他们从数据库中提取出来。这需要大约5毫秒,我不会对数据做任何事情(因为我还没有写那部分),只会跳到下一部分。

然而,当它到达正在添加到上下文中的新条目时,正是这一行导致了巨大的放缓。这是代码:

matchPerson = _context.Person.SingleOrDefault(c => c.PersonId == intPersonId);

因此,如果用户已经在数据库中,它会通过0ms哈希表检查将其从数据库中拉出(这是即时的)。

大约需要5毫秒。

如果我在这条线存在的情况下执行上述_context.Add,它会变得非常慢。如果我把它注释掉,大约需要40毫秒,随着每增加一条记录,它就会增加(所以在2000条记录之后,大约需要200毫秒)。

我看不到这两行之间的链接,所以上下文查询可能会重置上下文的状态,并减缓下一步操作的速度?

将对象添加到实体框架上下文大约需要1.5秒

根据注释中的要求(如果不是重复关闭),速度减慢与自动更改检测有关,DbContext API中默认启用自动更改检测。

禁用自动更改检测:

context.Configuration.AutoDetectChangesEnabled = false;

在这个公认的答案中可以找到一个更完整/完整的描述(我在这里肯定做得再好不过了):

为什么在EF 4.1中插入实体与ObjectContext相比如此缓慢?