2010-12-10 7 views
1

Pour mon modèle d'authentification, je souhaite m'assurer qu'il est impossible que le même e-mail soit enregistré plusieurs fois. Je suis nouveau à la fois nHibernate et partiellement LINQ, donc je demande si cela est assez suffisant d'une «vérification» pour s'assurer que cela se produise.Vérifiez minutieusement si un e-mail existe, 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; 
    } 

Existe-t-il un moyen plus intelligent d'accomplir cela? J'ai déjà eu des problèmes avec un programme précédent (j'ai utilisé Linq to SQL sur celui-là), et donc je voulais obtenir des conseils d'experts, cette fois-ci.

+0

@Femaref: Ne vous plaignez pas, mais qu'avez-vous changé? Je ne peux pas identifier de changements. – Ciel

+0

Je ne sais pas nécessairement comment le faire dans NHibernate, mais vous devez vous assurer que la transaction que vous créez est Serializable, de sorte qu'une adresse email dupliquée ne soit pas insérée entre le moment où vous vérifiez et le moment où vous effectuez votre insérer. –

+0

Stacey: mise en forme. Une partie de votre code n'a pas été formatée car elle n'était pas correctement mise en retrait. – Femaref

Répondre

4

Créer une contrainte unique comme John dit. Vous pouvez comprendre comment faire de cette question:

SQL Server 2005 How Create a Unique Constraint?

qui assurera un double ne se produit jamais.

+0

Y at-il un moyen d'associer cette cartographie dans nHibernate fluide que vous connaissez? – Ciel

+2

@Stacey vous devriez être capable de le spécifier comme carte (x => x.Email) .Unique(); – Phill

7

Ce que vous faites ici est de charger TOUS les membres et d'interroger la collection en mémoire.

Cette exécute la requête dans le DB:

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

Merci, c'est extrêmement utile. L'interroger sur la fin de DB le rendra beaucoup plus rapide. Il était très difficile de choisir laquelle des deux réponses comme étant acceptée, car les deux étaient très utiles. J'aimerais pouvoir les signaler tous les deux. – Ciel

+0

C'est bien; tout ce qui fonctionne le mieux pour vous devrait être la réponse acceptée :-) –

Questions connexes