DBContext SaveChanges Порядок выполнения оператора
-
27-10-2019 - |
Вопрос
У меня есть таблица, которая имеет уникальный индекс на таблице с порядковым столбцом. Так, например, в таблице будут следующие столбцы:
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 (), он нарушает уникальный индекс, поскольку, похоже, выполняет операторы в другом порядке, чем они были переданы. Например, происходит следующее:
- Повторное воздействие ординалов
- Удалить запись
Вместо:
- Удалить запись
- Повторное воздействие ординалов
Это правильное поведение 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
).
Но лучшим решением, вероятно, будет использоваться хранящаяся процедура, потому что ваше повторное воздействие должно вывести все затронутые записи из базы данных в ваше приложение, изменить их порядка и сохранить их обратно в базу данных один за другим.
Кстати. Делать это с запахами базы данных. В чем проблема с пробелом в вашей «порядковой» последовательности?