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

时间:2013-08-29 09:33:22

标签: 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毫秒,并且每增加一条记录就会增加(因此在2000条记录之后需要大约200毫秒)。

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

1 个答案:

答案 0 :(得分:1)

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

禁用自动更改检测:

context.Configuration.AutoDetectChangesEnabled = false;

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

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