Тщательно проверьте, существует ли электронная почта, NHibernate, LINQ - PullRequest
1 голос
/ 11 декабря 2010

Для моей модели аутентификации я хочу убедиться, что одно и то же письмо невозможно зарегистрировать более одного раза.Я новичок как в nHibernate, так и частично в LINQ, поэтому я спрашиваю, достаточно ли это «проверки», чтобы убедиться, что это происходит.

  public MembershipCreateStatus CreateUser(string email, string password)
  {
   if (String.IsNullOrEmpty(email)) throw new ArgumentException("Value cannot be null or empty.", "userName");
   if (String.IsNullOrEmpty(password)) throw new ArgumentException("Value cannot be null or empty.", "password");


   using (var session = sessionFactory.OpenSession())
   {
    using (var transaction = session.BeginTransaction())
    {
     var members = session.CreateCriteria<Member>().List<Member>();

     // determine is the email address already exists in the database
     if (members.Any(i => i.Email == email))
      return MembershipCreateStatus.DuplicateEmail;

     // create the new member, if they are valid
     var member = new Member { Email = email };

     session.SaveOrUpdate(member);
     transaction.Commit();
    }
   }
   return MembershipCreateStatus.Success;
  }

Есть ли более разумный способ сделать это?В прошлом у меня были проблемы с предыдущей программой (я использовал Linq to SQL на этой программе), поэтому я хотел получить совет специалиста, на этот раз.

Ответы [ 2 ]

7 голосов
/ 11 декабря 2010

То, что вы делаете, загружает ВСЕХ членов и запрашивает коллекцию в памяти.

Это выполняет запрос в БД:

//this of course goes inside the transaction
if session.Query<Member>().Any(i => i.Email == email))
    return MembershipCreateStatus.DuplicateEmail;
4 голосов
/ 11 декабря 2010

Создайте уникальное ограничение, как сказал Джон.Вы можете выяснить, как это сделать из этого вопроса:

SQL Server 2005 Как создать уникальное ограничение?

Это обеспечит повторение никогда не будет.

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