2010-12-15 5 views
1

Есть ли способ проверить свойство, которое должно быть уникальным на модели? Например, пользователь может создавать и редактировать «Продукт», но они не могут создавать продукт с существующим ProductCode, а также не могут редактировать продукт и изменять ProductCode на уже существующий код.MVC 2 Уникальная проверка индекса

Я пробовал использовать пользовательский атрибут.

public class Unique : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     var products = Repository.Store.Products.Where(x => x.ProductCode == value); 
     return (products.Count() == 0); 
    } 
} 

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

Невозможно иметь дело с уникальным индексом в MVC 2, я искал часы, даже нашел другие темы в stackoverflow, но ничего с твердым решением.

+0

Возможно, я не понимаю ваш вопрос, но является ли ProductCode основным ключом? Если нет, то почему? – 2010-12-15 13:28:51

ответ

3

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

Вот пример того, как можно вставить объект и определить, является ли или не удалось это из-за уникальное ограничение:

INSERT INTO MyTable (column1, column2, column3) 
    SELECT @param1, @param2, @param3 
    WHERE NOT EXISTS (SELECT * FROM table WHERE id = @param4) 

Если объект уже существует, то это изменит 0 строк. Если это не так, то он изменит 1 строку. Если что-то еще пойдет не так, вы получите исключение. Это также довольно эффективно (по крайней мере, на SQL-сервере). Это приводит к поиску индекса, за которым следует обновление индекса, точно так же, как вы надеетесь.

+0

Я рассматривал это для решения, но проблема в том, что нет «правильного» способа определить, произошло ли обновление из-за уникального индекса или что-то еще. Единственный способ, который я мог видеть, - сначала убедиться, что как исключения, так и внутренние исключения соответствуют ожидаемым типам, а затем выполнить строковое соответствие для внутреннего сообщения исключения. Но это может вызвать проблемы в будущем. Я не слишком беспокоюсь о нескольких обновлениях одновременно. Это может вызвать исключение, и они могут попробовать еще раз ... его очень маловероятно, что это произойдет, не так много пользователей или обновлений – Craigt 2010-12-15 13:48:50

0

Я немного боролся с MVC в связанной области.

Часть ответа, почерпнутого на мой вопрос, состояла в том, что вы должны «вероятно» иметь отдельную модель для Вставки и обновления объекта.

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

В противном случае, просто позаботьтесь об этом как о нормальной проверке кода в вашем методе вставки, а не в настраиваемом атрибуте.

+0

Я тоже думал о двух отдельных моделях, но до сих пор нет способа проверить, изменился ли код продукта или нет при использовании атрибута. – Craigt 2010-12-15 13:54:10

0

Ok я вижу ....

Вы можете сделать «не равно» проверить на существует какой-то уникальный идентификатор на объект - таким образом вы проверить на наличие кода продукта, а не на текущий продукт.

 Смежные вопросы

  • Нет связанных вопросов^_^