2017-01-08 12 views
1

私は一意でなければならない属性Nameを持つクラスUserを持っています。問題は、それがこのEXをスロー繰り返し名前を持つユーザーを挿入しようとすることで、EFコードを使用して属性のユニティシティを制御する最善の方法最初に

  • 注釈

    [StringLength(100)] 
    [Index(IsUnique = true)] 
    public string Name { get; set; } 
    

: は、これまでのところ、私はこれをチェックする3つの方法を検討してきましたDbUpdateException あなたが見ることができるように、私は内側の例外(私はそれが可能であるかどうかわからないが、私はそれを仮定する)と最後の内部例外のメッセージに移動する必要があります。

  • 流暢APIは

https://stackoverflow.com/a/23155759/5750078

私はそれを試してみましたhaven'tが、私はそれは同じ問題注釈を持っていると信じています。手で

  • チェック

コントローラコード:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "Name,Password,Profile")] User user) 
    { 
     if (ModelState.IsValid) 
     { 
      lock (locker) 
      { 
       validateNameUnicity(); 
       db.Users.Add(user); 
       db.SaveChanges(); 
      } 
      return RedirectToAction("Index"); 
     } 

     return View(user); 
    } 

問題:チェック日付ベースcheckingsほど正確ではないかもしれない私のコードに依存します。私は他の2つのオプションより多くのロジックをプログラムする必要があります。最後に、何らかの形でデータベースに直接アクセスすれば、何のチェックも全く行われません。

私は自分自身で学習しようとしているので、これを行うのがベストプラクティスであることを知る必要があります。できるだけベストを尽くしたいと思います。

答えて

4

同時ユーザーが同じレコードを後で挿入する場合は、コードの一意性インデックスを最終的なガードとして使用する必要があります。 (チェックと実際の挿入物との間の待ち時間のために)。

これは、SaveChangesを呼び出す際に常に例外をキャッチする必要があることを意味しますが、それはとにかく悪い考えではありません。

私がhereと記載したメカニズムを使用すると、emailNameに変更するだけでよいです。

あなたはこの拡張メソッドによって内部例外のチェーンから最後の例外メッセージを掘ることができます:

public static string GetDeepestExceptionMessage(this Exception exception) 
{ 
    string msg = string.Empty; 
    while (exception != null) 
    { 
     msg = exception.Message; 
     exception = exception.InnerException; 
    } 
    return msg; 
} 
関連する問題