2011-09-16 12 views
2

こんにちは、私はMVCとEFの新機能ですので、これは本当に簡単な質問かもしれませんが、重複するレコードを入力しようとするのを防ぐ最良の方法は何ですか?重複レコードを防ぐMVCエンティティフレームワークの確認

私は、プライマリキーである1つの列を持つ簡単なルックアップテーブルを持っています。管理画面を作成しているので、管理者はルックアップリストに余分な項目を追加できます。重複レコードを停止し、死の黄色の画面を停止しますが、表示されるメッセージがある

public ActionResult Index(string NewRow) 
    { 
     try 
     { 
      CaseType t = new CaseType { ID = NewRow }; 
      if (ModelState.IsValid) 
      { 
       UOW.CaseTypes.Add(t); 
       UOW.Save(); 
      } 
     } 
     catch (Exception ex) 
     { 
      ModelState.AddModelError("", ex.Message); 
     } 
     return View(UOW.CaseTypes.All()); 
    } 

:「エントリを更新中にエラーが発生した詳細については、内部例外を参照してください。。」私のコントローラのように見えますこれはユーザーには良いことではありません。

私は、エラーをキャッチするためのより良い方法があるかどうか疑問に思っていました。私はこのようなものを使用ショー検証エラーのために

答えて

3

MainEmailそれは、プロパティのViewModelに

 var mod = ModelState.First(c => c.Key == "MainEmail"); // this 
     mod.Value.Errors.Add("Row's shouldn't duplicates."); // this 

     if (ModelState.IsValid) 
     { 
      return RedirectToAction("Details"); 
     } 

     return View(client); 

からのエラーは、ビューでは、この分野でのが表示されます:

<div class="editor-label"> 
     @Html.LabelFor(model => model.MainEmail) 
    </div> 

と将来のために、エラー画面を非表示にする必要があります!あなたはASP-MVC-3を使用する場合は、

web.configファイルなどの文字列に追加します:あなたは、カスタムエラーページを表示する必要が

<system.web> 
    <customErrors mode="On" defaultRedirect="~/Error" /> 
    ... 

ユーザーは/Shared/Error.cshtmlページはのinstedています例外メッセージを含むページ(順序データを表示することができます)。あなたのtryコードを持つレコードの重複についてチェックすることができるよりも

ユニーク制約の作成についてADD

はここ Unique Constraint in Entity Framework Code First

議論されました。

私のアプリケーションでは、最初にコードを使用しており、テスト容易性が低下するため一意制約を追加しません。その場合は単純にを使用してください。変更を保存する前にを見つけてください。

最初のaproachは少し速いです。

アプローチ2は、テスト容易性が成長しています。構文:)

+0

うーん...私の答えはあなたを助けないことについてあまりわから –

+0

素晴らしいおかげで、私は今開発中のエラー画面を取り除くことを計画していましたが、トップチップに感謝します。 – Jammy

+0

こんにちは、ちょうどあなたのコードが役に立っている間にこれを迷惑にしてしまいました。それは実際に私が探していたものを達成していません。フォームデータ内のフィールドを探して検証メッセージを追加するだけです。私が探していたのは、重複をチェックする方法だったので、例えば、すでにテーブルに "22"という大文字小文字の型があり、ある時点で別の "22"を作成しようとすると、 "sorry thats duplicate"むしろ黄金の死の「バム」の画面。ちょうど私が最初にデータに "find"を実行する必要があるか、またはサーバー上の負荷がより少ないエラーをキャッチするかどうか疑問に思っていますか? – Jammy

0

あなたは、このように行うことができ、内部例外を取得したい場合は

ない、

catch (Exception ex) 
     { 
      while(ex.InnerException!=null){ 
       ex=ex.InnerException; 
      } 
      ModelState.AddModelError("", ex.Message); 
     } 

何?

関連する問題