2010-12-10 5 views
1

Для моей модели аутентификации я хочу убедиться, что невозможно, чтобы одно и то же электронное письмо регистрировалось более одного раза. Я новичок в 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 на этом), и поэтому на этот раз я хотел получить совет экспертов.

+0

@Femaref: Не хватать, но что вы изменили? Я не могу определить никаких изменений. – Ciel

+0

Я не обязательно знаю, как это сделать в NHibernate, но вы должны убедиться, что созданная транзакция является Serializable, так что дублирующий адрес электронной почты не вставлен между временем, которое вы проверяете, и временем, которое вы выполняете вставить. –

+0

Stacey: форматирование. Некоторые из вашего кода не были отформатированы, так как они не были отступом должным образом. – Femaref

ответ

4

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

SQL Server 2005 How Create a Unique Constraint?

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

+0

Есть ли способ связать это сопоставление с текущим nHibernate, о котором вы знаете? – Ciel

+2

@Stacey вы должны иметь возможность указать его как Map (x => x.Email) .Unique(); – Phill

7

Что вы делаете, это загрузка ВСЕХ членов и запрос коллекции в память.

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

//this of course goes inside the transaction 
if session.Query<Member>().Any(i => i.Email == email)) 
    return MembershipCreateStatus.DuplicateEmail; 
+0

Спасибо, это чрезвычайно полезно. Запрос его на конец БД сделает его намного быстрее. Было очень сложно выбрать, какой из двух ответов на флаг, как принятый, так как оба были очень полезны. Хотел бы я отметить их обоих. – Ciel

+0

Это нормально; то, что лучше всего подходит для вас, должно быть принятым ответом :-) –

Смежные вопросы