c# - 将对象添加到 Entity Framework 上下文大约需要 1.5 秒

标签 c# entity-framework

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

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

(伪代码)

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);

当我分析代码时,这个人的构建需要 0 毫秒,快如闪电。但是,当我将此人添加到上下文中时,大约需要 1500 毫秒。可能与约束检查有关吗?数据库非常大,虽然它没有加载到内存或任何东西中,所以在它执行 Add 时它不应该触及数据库。

只有当我执行 _context.SaveChanges() 时才应该写入。

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

编辑:基准测试是这样完成的:(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 毫秒,并且每添加一条记录都会增加(因此在 2,000 条记录之后大约需要 200 毫秒)。

我看不到这两行之间的链接,所以也许上下文查询重置了上下文的状态并减慢了下一个操作?

最佳答案

根据评论中的要求(如果这不是关闭重复项),减速与自动更改检测有关,它在 DbContext API 中默认启用。

要禁用自动更改检测:

context.Configuration.AutoDetectChangesEnabled = false;

可以在这个已接受的答案中找到更完整/完整的描述(我在这里当然不能更好):

Why is inserting entities in EF 4.1 so slow compared to ObjectContext?

关于c# - 将对象添加到 Entity Framework 上下文大约需要 1.5 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18507201/

相关文章:

c# - 在弹出窗口中获取 IOC 容器

c# - 如何删除仍在其他程序中打开的临时文件?

c# - 在 asp.net Web API 中映射数组

c# - 具有自托管代理的 Azure DevOps Pipeline 无法运行任务

entity-framework - Entity Framework SaveChanges() 不起作用?

c# - Entity Framework Code First - 两个名称相同但 namespace 不同的实体

c# - Entity Framework 不加载相关对象

c# - 比较对象

php - 两个实体之间的 Symfony2 关系

c# - 泛型和 LINQ to XML