Следуя инструкции NerdDinner, не допускайте дублирования - PullRequest
0 голосов
/ 09 марта 2010

Моя база данных sql не позволяет добавлять 2 записи с одинаковым номером.Если я попытаюсь создать запись с ранее использованным номером или отредактировать запись, чтобы использовать ранее использованный номер, он не разрешит ее и вернется на страницу редактирования / создания со звездочкой в ​​поле номера субподряда.Я хотел бы добавить нарушение правил для этого, чтобы можно было отобразить соответствующее сообщение.Я попытался добавить это:

 if (db.subcontracts.Count(s => s.subcontract_no == subcontract_no) > 0)
      yield return new RuleViolation("Subcontract number already exists", "subcontract_no");

Когда я писал это, я думал только о методе Create.Проблема здесь в том, что он находит нарушение каждый раз, когда я редактирую запись, даже если subcontract_no не изменилось.Итак, я думаю, мне нужно найти нарушение, когда запись создается и когда редактируется, если subcontract_no изменяется.Но он не может «найти себя» и создать нарушение правил.Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 09 марта 2010

Попробуйте:

db.subcontracts.Count(s => (s.subcontract_no == subcontract_no) 
    && (s.id != actually_edited_or_created_contract.id)).Count

Он будет работать с новым или существующим объектом, даже если entity.id == null.

1 голос
/ 09 марта 2010

Во-первых, на вашей странице редактирования / обновления, если значение не может быть изменено, не отображайте его как редактируемое значение. Возможно, вы захотите вернуть ViewModel в действии, получить соответствующую модель из БД и использовать TryUpdateModel с ограничением, исключающим неизменяемые поля. Во-вторых, в своем коде проверки пропустите проверку на наличие дублирующего номера субконтракта, когда типом изменения является Обновление (вместо Вставить). Добавьте к этому немного кода, который связан с обработчиком изменения свойства для свойства номера субконтракта, которое выдает исключение, если номер субконтракта уже имеет (не начальное) значение, и вы пытаетесь его изменить. Это должно препятствовать установке значения, кроме как при вставке, и позволяет пропустить проверку проверки при обновлении.

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

...