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

C# 将对象添加到实体框架上下文大约需要1.5秒,c#,entity-framework,C#,Entity Framework,我在寻找为什么会这样,或者我可以加快速度的方法 我基本上是用这样的代码构造一个对象 (伪代码) 最后: \u context.Person.Add(p) 当我分析代码时,人的结构需要0毫秒,这是闪电般的快。然而,当我将人物添加到上下文中时,大约需要1500毫秒。这可能与约束检查有关吗?数据库相当大,尽管它没有加载到内存或任何东西中,因此在执行添加时,它不应该触及数据库 只有当我执行\u context.SaveChanges()时,才应该编写它 有什么提高速度的建议吗 编辑:基准测试是这样完成的

我在寻找为什么会这样,或者我可以加快速度的方法

我基本上是用这样的代码构造一个对象

(伪代码)

最后:

\u context.Person.Add(p)

当我分析代码时,人的结构需要0毫秒,这是闪电般的快。然而,当我将人物添加到上下文中时,大约需要1500毫秒。这可能与约束检查有关吗?数据库相当大,尽管它没有加载到内存或任何东西中,因此在执行
添加时,它不应该触及数据库

只有当我执行
\u context.SaveChanges()
时,才应该编写它

有什么提高速度的建议吗

编辑:基准测试是这样完成的:(sw是一个
新秒表()

编辑2:绘图变厚

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

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

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

matchPerson=\u context.Person.SingleOrDefault(c=>c.PersonId==intPersonId)

因此,它通过0ms哈希表检查(即时检查)将已经在数据库中的人从数据库中拉出

大约需要5毫秒

如果我执行上面的
\u context.Add
,当这一行出现时,它会变得非常慢。如果我把它注释掉,它需要大约40毫秒,并且每增加一条记录,它就会增加(所以在2000条记录之后,它需要大约200毫秒)


在这两行之间我看不到任何链接,因此上下文查询可能会重置上下文的状态并减慢下一个操作的速度?

根据注释中的要求(如果这不是重复的),减慢与自动更改检测有关,在
DbContext
API中默认为打开

要禁用自动更改检测,请执行以下操作:

context.Configuration.AutoDetectChangesEnabled = false;
在这个公认的答案中可以找到更完整/完整的描述(我在这里肯定没有更好的描述):


1500毫秒太多了,即使它是以db为单位写入的。你确定你的基准测试是正确的吗(或者操作中没有涉及任何其他内容)?我想是的,我只是在那条线上绕了一个秒表。我在问题中添加了代码。您是否在IDE中执行测试?您是否编译为发布或调试模式?请参阅常见的基准测试错误。是的,它处于调试状态,我将尝试在发布模式下编译它,但我没有想到它会产生足够的影响,因为我没有尝试减少毫秒数。我很快会让你知道……实体是否特别大/复杂?可能与自动更改检测()有关,尽管从您所说的来看似乎不太可能=o。Ohlin的观点很好,这是每次添加都会发生,还是只是第一次?谢谢。这是即时的。我仍然有兴趣知道为什么在保存更改之间对上下文进行查询会带来如此高的性能成本。我不确定该答案()注释中的第一个链接是否有任何额外的说明(与拍摄对象快照的实际过程有关,带有一些基准)。
sw.Restart();
context.Person.Add(p);
Console.WriteLine("Person added to context: " + sw.ElapsedMilliseconds + "ms");
context.Configuration.AutoDetectChangesEnabled = false;