MVC 2 Уникальная проверка индекса - PullRequest
1 голос
/ 15 декабря 2010

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

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

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, но ничего с солидным решением.

Ответы [ 3 ]

3 голосов
/ 15 декабря 2010

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

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

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

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

0 голосов
/ 15 декабря 2010

Хорошо, я вижу ....

Можете ли вы выполнить проверку "не равно" для существования уникального идентификатора объекта - таким образом вы проверяете наличие кода продукта, НО на текущем продукте.

0 голосов
/ 15 декабря 2010

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

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

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

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

...