2

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

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

(伪代码)

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 is a 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 毫秒)。

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

4

1 回答 1

1

根据评论中的要求(如果没有关闭重复),减速与自动更改检测有关,该检测在DbContextAPI 中默认启用。

要禁用自动更改检测:

context.Configuration.AutoDetectChangesEnabled = false;

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

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

于 2013-08-29T10:16:40.603 回答