实体框架事务:什么是更好的性能方面

本文关键字:更好 性能 方面 什么 框架 事务 实体 | 更新日期: 2023-09-27 17:53:52

哪个性能更好:

using (GADEEntities context = new GADEEntities(_connectionString))
{
   using (TransactionScope transaction = new TransactionScope())
   {
      AddToContext1(context);
      AddToContext2(context);
      AddToContext3(context);
      ...
      context.SaveChanges();
      transaction.Complete();
   }
}

using (GADEEntities context = new GADEEntities(_connectionString))
{
   using (TransactionScope transaction = new TransactionScope())
   {
      AddToContext1(context);
      context.SaveChanges();
      AddToContext2(context);
      context.SaveChanges();
      AddToContext3(context);
      context.SaveChanges();
      ...
      transaction.Complete();
   }
}

在任何时候,这都可能在客户端机器上转换成5000多个插入到数据库中的操作。两种方式有什么不同吗?

实体框架事务:什么是更好的性能方面

很可能您的第一个版本总是更快,这取决于AddToContext的确切功能。如果您的AddToContext方法向上下文添加单个或仅几个新对象,那么肯定会快得多。在每次插入(也可能是更新和删除)之后调用SaveChanges会大大降低性能。

下面是一个类似问题的一些度量:

插入实体框架的最快方法

你设置的方式,我不认为有什么显著的区别。无论哪种方式,数据都可以传输,这才是真正的瓶颈。

差别很大,因为第二个版本大错特错。

你写这段代码是干什么的:

AddToContext1(context);
context.SaveChanges(false);

您将记录添加到添加状态的上下文,并让上下文将记录插入到数据库中,但同时您说:"让数据处于添加状态"。

如果你调用这个会发生什么:

AddToContext2(context);
context.SaveChanges(false);

添加另一条记录到已添加状态的上下文,并让上下文将所有已添加状态的记录插入数据库=第一条记录将再次添加

如果AddToContext实际上执行更新并不重要,因为它将简单地再次执行DB命令。因此,如果您有5000条记录,您将插入或更新第一个记录5000次!

如果你想使用第二个版本,你仍然必须在每次保存时接受更改。

顺便说一句。SaveChanges过载接受bool在EFv4中已过时。