Вопрос

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

TableId, ID1, ID2, Орден

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

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

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

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

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

Вместо:

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top