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でこれを行う方法を必ずしも知っているわけではありませんが、あなたが作成するトランザクションがシリアライズ可能であることを確認する必要があるので、チェックした時間と実行した時間の間に重複した電子メールアドレスが挿入されませんインサート。 –

+0

Stacey:フォーマット。あなたのコードのいくつかは、正しく字下げされていないので、フォーマットされませんでした。 – Femaref

答えて

4

は、一意性制約を作成します。

SQL Server 2005 How Create a Unique Constraint?

発生したことがないの重複を確保すること:あなたはこの質問からそれを行う方法を見つけ出すことができます。

+0

あなたが気付いている流暢なnHibernateにこのマッピングを関連付ける方法はありますか? – Ciel

+2

@Stacey Map(x => x.Email).Unique();のように指定できるはずです。 – Phill

7

あなたがやっていることは、すべてのメンバーを読み込んで、そのコレクションをメモリに照会することです。

これはDBでクエリを実行:ジョンが言ったように

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

ありがとう、これは非常に便利です。 DBの終わりでそれを照会することはそれをより速くするでしょう。両方が非常に有益だったので、2つの回答のうちのどれが受け入れられたものとしてフラグを立てるかを選ぶことは非常に困難でした。私はそれらの両方にフラグを立てることができたらいいなあ – Ciel

+0

それは問題ありません。あなたのために何がうまくいくかは、受け入れられた答えでなければなりません:-) –

関連する問題