Тщательно проверьте, существует ли электронная почта, NHibernate, LINQ
Для моей модели аутентификации я хочу убедиться, что одно и то же письмо невозможно зарегистрировать более одного раза. Я новичок в 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 для SQL на этой программе), поэтому я хотел получить совет специалиста, на этот раз.
2 ответа
Решение
Создайте уникальное ограничение, как сказал Джон. Вы можете понять, как это сделать из этого вопроса:
SQL Server 2005 Как создать уникальное ограничение?
That will ensure a duplicate never occurs.
Там вы загружаете ВСЕХ участников и запрашиваете коллекцию в памяти.
Это выполняет запрос в БД:
//this of course goes inside the transaction
if session.Query<Member>().Any(i => i.Email == email))
return MembershipCreateStatus.DuplicateEmail;