Entity Framework Transaction: что лучше с точки зрения производительности? - PullRequest
2 голосов
/ 28 апреля 2011

Который имеет лучшую производительность:

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+ вставок в БД на клиентском компьютере. В любом случае отличается?

Ответы [ 3 ]

2 голосов
/ 26 мая 2011

Вполне вероятно, что ваша первая версия будет всегда быстрее, в зависимости от того, что именно делает AddToContext. Если ваш метод AddToContext добавляет один или несколько новых объектов в контекст, он определенно будет намного быстрее . Вызов SaveChanges после каждой вставки (и, возможно, также обновление и удаление) сильно снижает производительность.

Вот несколько измерений в аналогичном вопросе:

Самый быстрый способ вставки в Entity Framework

1 голос
/ 28 апреля 2011

Существует очень большая разница, потому что вторая версия ужасно неверна.

Что вы делаете с помощью этого кода:

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

Вы добавляете запись в контекст в состоянии добавленного и позволяете контекстувставить запись в базу данных, но в то же время вы говорите: «Пусть данные в состоянии добавлено».

Что радует, если вы называете это:

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

Вы добавляете еще одну записьк контексту в состоянии «добавлено» и пусть контекст вставит все записи в состоянии «добавлено» в базу данных = первая запись будет добавлена ​​снова

Не имеет значения, действительно ли AddToContext выполняет обновлениепотому что он просто сделает команду DB снова.Поэтому, если у вас есть 5000 записей, вы вставите или обновите первую 5000 раз!

Если вы хотите использовать вторую версию, вам все равно придется принимать изменения при каждом сохранении.

Кстати.SaveChanges bool, принимающий перегрузку, устарел в EFv4.

1 голос
/ 28 апреля 2011

То, как вы это настроили, я не думаю, что есть какая-либо существенная разница. Данные будут передаваться в любом случае, и это настоящее узкое место.

...