Пакетная обработка Entity Framework CORE занимает много времени - PullRequest
0 голосов
/ 20 июня 2020

Я передаю несколько записей с помощью Jquery ajax () контроллеру. Net CORE MVC для пакетного обновления таблицы SQL. Затем он вызывает TransactionalDeleteAndInsert() в репозитории для удаления, а затем вставляет записи, как показано в следующем коде.

По завершении выполняется _repoContext.SaveChangesAsync(). Действия удаления / обновления занимают несколько секунд, но когда я обновляю sh экран или перехожу на другую страницу, метод get для получения обновленного списка занял более 2 часов. Что я делаю не так?

public int BatchInsert(IList<T> entityList)
{
  int inserted = 0;
  foreach(T entity in entityList)
  {
    this.RepositoryContext.Set<T>().Add(entity);
    inserted++;
  }

  return inserted;
}

public int BatchDelete(IList<T> entityList)
{
  int deleted = 0;
  foreach(T entity in entityList)
  {
    this.RepositoryContext.Set<T>().Remove(entity);
    deleted++;
  }
  return deleted;
}

public List<int> TransactionalDeleteAndInsert(IList<T> deleteEntityList, IList<T> insertEntityList)
{
  using (var transaction = this.RepositoryContext.Database.BeginTransaction())
  {
    int totalDeleted = this.BatchDelete(deleteEntityList);
    int totalInserted = this.BatchInsert(insertEntityList);
    transaction.Commit();

    List<int> result = new List<int>();
    result.Add(totalDeleted);
    result.Add(totalInserted);

    return result;
  }
}

1 Ответ

1 голос
/ 20 июня 2020

В приведенном выше фрагменте не выполняется метод SaveChangesAsync() или SaveChanges() (я так понимаю, вы выполняете его позже).

Это означает, что весь процесс происходит локально в вашем контексте / памяти только .

Транзакции

Тот факт, что методы BatchDelete () и BatchInsert () заключены в транзакцию, не имеет значение, потому что эти операции происходят в вашем контексте, который, вероятно, будет воссоздан в вашем следующем запросе (учитывая, что его время жизни ограничено).

Транзакция имела бы больше смысла, если бы ваш код был таким

  using (var transaction = this.RepositoryContext.Database.BeginTransaction())
  {
    int totalDeleted = this.BatchDelete(deleteEntityList);
    this.SaveChanges();
    int totalInserted = this.BatchInsert(insertEntityList);
    this.SaveChanges();
    transaction.Commit();

    List<int> result = new List<int>();
    result.Add(totalDeleted);
    result.Add(totalInserted);

    return result;
  }

Итак, если по какой-либо причине ваша вторая операция с базой данных завершится неудачно, первая тоже откатится. (Я знаю, что этот пример не будет иметь смысла в вашем случае, вы можете просто выполнить метод SaveChanges() в конце вашего метода TransactionalDeleteAndInsert(), и вы можете избежать нежелательных данных, сохраненных в вашей базе данных, в случае сбоя вставки)

Медленные операции с базами данных

Это может быть вызвано многими причинами. Это может быть медленный сервер sql, очень большие таблицы или длинные списки добавления / удаления. Это причина того, что когда вы обновляете sh, это занимает много времени, потому что, обновляя, вы снова запрашиваете свою базу данных, когда она уже находится под большим давлением.

...