DbContext SaveChanges Порядок выполнения операторов - PullRequest
11 голосов
/ 07 сентября 2011

У меня есть таблица с уникальным индексом для таблицы со столбцом Ordinal. Так, например, таблица будет иметь следующие столбцы:

TableId, ID1, ID2, порядковый номер

Уникальный индекс для столбцов ID1, ID2, Порядковый номер.

Проблема, с которой я столкнулся, заключается в том, что при удалении записи из базы данных я заново упорядочиваю порядковые номера, чтобы они снова стали последовательными. Моя функция удаления будет выглядеть так:

    public void Delete(int id)
    {
        var tableObject = Context.TableObject.Find(id);
        Context.TableObject.Remove(tableObject);
        ResequenceOrdinalsAfterDelete(tableObject);
    }

Проблема в том, что когда я вызываю Context.SaveChanges (), он нарушает уникальный индекс, поскольку кажется, что он выполняет инструкции в другом порядке, чем они были переданы. Например, происходит следующее:

  1. Повторная последовательность Ординалов
  2. Удалить запись

Вместо:

  1. Удалить запись
  2. Повторная последовательность Ординалов

Это правильное поведение EF? И если это так, есть ли способ переопределить это поведение, чтобы принудительно выполнить порядок выполнения?

Если я не объяснил это правильно, пожалуйста, дайте мне знать ...

1 Ответ

11 голосов
/ 07 сентября 2011

Порядок команд полностью находится под контролем EF. Единственный способ повлиять на заказ - использовать отдельные SaveChanges для каждой операции:

public void Delete(int id)
{
    var tableObject = Context.TableObject.Find(id);
    Context.TableObject.Remove(tableObject);
    Context.SaveChanges();
    ResequenceOrdinalsAfterDelete(tableObject);
    Context.SaveChanges();
}

Вы также должны запустить этот код в транзакции, созданной вручную, чтобы обеспечить атомарность (=> TransactionScope).

Но лучшим решением, вероятно, было бы использование хранимых процедур, потому что при повторном упорядочении необходимо перенести все затронутые записи из базы данных в ваше приложение, изменить их порядковый номер и сохранить их обратно в базу данных по одной.

Btw. делать это с запахами базы данных. В чем проблема с пробелом в вашей «порядковой» последовательности?

...