2010-11-16 4 views
2

У меня есть таблица Users, в которой нет двух одинаковых пользователей, что является лучшим способом сделать эту ошибку бесплатной?asp.net mvc избежать дублирования

То, что я сделал, это то, что я написал чек для дублирования в контроллере, но кто-то сказал мне, что это неправильная вещь. Он сказал, что он уникален в таблице базы данных? Я реализовал это и на нескольких других контроллерах. Должен ли я его изменить?

+0

Я забыл упомянуть, что я использую linq для sql – maztt

ответ

3

Есть несколько мест, где вы должны это сделать.

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

- редактировать -

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

- конец редактирования -

пожалуйста, имейте в виду, что код проверки должны быть помещены в модели и научиться писать управляемый код OO вы можете увидеть пример от mvc store front.

надеюсь, что это поможет

+1

Метод клиентской стороны хорош, но может легко привести к сбору базы данных пользователей или их писем от вас, поэтому я бы не рекомендовал ее. – Migol

+0

@Migol, Соглашаться с вами. Есть способы предотвратить это, но вы правы, вы должны помнить об этом. –

+0

Ограничения Db ужасны, чтобы делать этот тип работы с ЕСЛИ вы ожидаете, что пузырьковое сообщение об ошибке появится во всем коде. Все становится зависимым от какого-либо типа службы сообщений об ошибках. – jfar

5

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

2 просит создать пользователя с тем же именем примерно в одно и то же время.

  1. Запрос 1 проверяет наличие БД, если существует - пользователя нет;
  2. Вскоре после запроса запросите 2 проверки БД, чтобы узнать, существует ли - пользователь этого не делает;
  3. Запрос 1 создает этого пользователя.
  4. Запрос 2 создает дубликата пользователя.
  5. Банг. Все перестает работать так, как вы ожидаете.

Что касается использования уникального ограничения или для его использования в качестве первичного ключа, это другой вопрос и очень многое зависит от вашей ситуации (потому что у вас есть первичный ключ какого-то типа на этой таблице, дон 't вы?)

+0

Использование транзакции - хорошая практика ... – Migol

+1

@Migol, I согласился бы, но база данных по-прежнему является местом для этого ограничения, независимо от того, использует ли внешний интерфейс транзакции или нет. – Paddy

+0

Erm, upvote, но одна проблема, вы хотите использовать уникальное ограничение - потому что вы действительно не хотите использовать «реальное» значение в качестве первичного ключа. – Murph