Как обеспечить уникальное значение столбца внутри кода? - PullRequest
1 голос
/ 05 сентября 2011

Я изучаю ASP.NET MVC и не могу понять, как обеспечить уникальные значения для столбцов (имя пользователя и адрес электронной почты) для таблицы.

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

EDIT:

Я знаю, что могу применить ограничение уникального ключа к столбцам моей таблицы и достичь его. Тем не менее, я хочу знать, как я могу достичь этого с помощью кода ASP.NET MVC?

UPDATE:

Я хочу выполнить проверку в моем приложении таким образом, чтобы дублированные значения не передавались в DAL, т. Е. Выполнить проверку перед вставкой новой строки.

Ответы [ 2 ]

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

В архитектуре ASP.NET MVC вы должны попытаться выполнить большую часть своей проверки в Модели, но с такими низкоуровневыми правилами проверки это иногда невозможно.В таком случае вам следует искать ответы в ответ на вопрос о доменном дизайне (DDD), где Службы приложений могут удовлетворить такие потребности низкого уровня.

Службы приложений будут иметь доступ к базе данных (либо напрямую)или, что еще лучше, косвенно через репозитории ) и может выполнять низкоуровневую проверку и выдавать ValidationException или что-то подобное (с подробной информацией Controller может воздействовать на пользователя и реагировать на него), когда необходимоили бизнес-правило не соблюдается.

Архитектура S # arp реализует все это в оптимальной среде, которую можно использовать в качестве основы для приложений ASP.NET MVC.Он высоко ценит принципы DDD и NHibernate, и иногда он заставит вас задуматься о том, как вы делаете вещи, что является своего рода точкой.Самая важная часть в этом заключается в том, что он научит вас, как решать подобные проблемы.

Чтобы ответить на ваш вопрос более конкретно и в духе DDD, я бы решил его так:

public class UserController
{
    private readonly IUserService userService;

    public UserController(IUserService userService)
    {
        // The IUserService will be injected into the controller with
        // an "Inversion of Control" container like NInject, Castle Windsor
        // or StructureMap:
        this.userService = userService;
    }

    public ActionResult Save(UserFormModel userFormModel)
    {
        if (userFormModel.IsValid)
        {
            try
            {
                // Mapping can be performed by AutoMapper or some similar library
                UserDto userDto = Mapper.Map<UserDto>(userFormModel);
                this.userService.Save(userDto);
            }
            catch (ValidationException ve)
            {
                ViewBag.Error = ve.Detail;
            }
        }

        // Show validation errors or redirect to a "user saved" page.
    }
}

public class UserService : IUserService
{
    private readonly IUserRepository userRepository;

    public UserService(IUserRepository userRepository)
    {
        // The IUserRepository will be injected into the service with
        // an "Inversion of Control" container like NInject, Castle Windsor
        // or StructureMap:
        this.userRepository = userReposityr;
    }

    public UserDto Save(UserDto userDto)
    {
        using (this.userRepository.BeginTransaction())
        {
            if (!this.userRepository.IsUnique(userDto.UserName))
            {
                // The UserNameNotUniqueValidationException will inherit from ValidationException
                // and build a Detail object that contains information that can be presented to
                // a user.
                throw new UserNameNotUniqueValidationException(userDto.UserName);
            }

            userDto = this.userRepository.Save(userDto);
            this.userRepository.CommitTransaction();

            return userDto;
        }
    }
}
0 голосов
/ 05 сентября 2011

Млия, это то, что вы контролируете на уровне базы данных, а не на уровне приложения.

Если вы проектируете базу данных с таблицей users, в которой вы хотите ограничить username и email столбцы должны быть UNIQUE, вы должны создать УНИКАЛЬНЫЙ ИНДЕКС для таких столбцов.

, не зная вашей базы данных (mySQL, SQL Server, MS Access, Oracle ...), это не такчтобы показать вам фотографии или рассказать гораздо больше, просто создайте таблицу с дизайнером и добавьте эти уникальные ограничения в эти столбцы, и благодаря дизайну вы будете уверены, что никакие дублированные значения никогда не будут вставлены для имени пользователя и электронной почты.

Iтакже предложите вам создать столбец идентификатора, который будет установлен как PK (первичный ключ, что означает, что он будет автоматически установлен как NON NULL и UNIQUE).

Из вашего приложения ASP.NET MVC вы, конечно, должны сделатьубедитесь, что дублированные значения не передаются в DAL для имени пользователя и электронной почты.Вы можете сделать это по-разному, проще всего, вероятно, проверить перед вставкой новой строки, если какой-либо пользователь уже существует с таким именем пользователя и / или электронной почтой, и если это так, вы можете показать уведомление, сообщающее пользователю, пожалуйста, выберите другую пару значений.

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