gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:36:34 26 4
gpt4 key购买 nike

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

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

(伪代码)

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/

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