Нарушение составного уникального обновления в Entity Framework - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть таблица с составным уникальным, я бы позволил пользователям менять местами порядковые номера, но SQL выдает нарушение уникального ключа. Предположительно, потому что нарушения проверяются после каждого изменения строки

public class RateCodes
{
   public int Id { get; set; }
   //Unique Composite Key Field 1
   public int Sequence { get; set; }
   //Unique Composite Key Field 2
   public int DivisionId { get; set; }
   public Decimal RateCode { get; set; }
}

В нашем клиенте мы хотим разрешить пользователю изменять порядок своих кодов тарификации.

Однако, когда я выполняю обновление, я получаю исключение

"System.Data.Entity.Infrastructure.DbUpdateException: при обновлении записей произошла ошибка. Подробности см. Во внутреннем исключении.

System.Data.Entity.Core.UpdateException: при обновлении записей произошла ошибка. Смотрите подробности во внутреннем исключении.

System.Data.SqlClient.SqlException: Нарушение ограничения UNIQUE KEY 'UX_RateCodes_Sequence'. Невозможно вставить дубликат ключа в объект 'dbo.RateCodes'. Дубликат значения ключа (346, 3)

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

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

1 Ответ

0 голосов
/ 05 сентября 2018

Как я могу решить эту проблему?

Как уже говорилось, решить эту проблему не так просто. Обновление ключей по своей сути проблематично, а уникальные ограничения не откладываются.

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

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

update RateCodes set sequence = sequence_new 
where id = @id and sequence_new is not null

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...