2012-01-17 11 views
25

データアクセスからモデルを分離したいので、私はFluent API構成でDataAnnotationを使用することを好む。Fluent APIの設定をMVCクライアント側の検証で行うにはどうすればいいですか?

MVCで試したことがありますが、Fluent APIはクライアント側の検証では機能しません。簡単に言えば、Fluent APIをDataAnnotationで実行できるようにクライアント側で検証する簡単な方法はありますか?

答えて

35

いいえ、流暢なAPIはちょうどマッピング正しいです。データアノテーションはマッピングと検証の両方であり、間違っています。データアノテーションは、EFコードの最悪の機能の1つです。これは、このように使用すると、永続性をプレゼンテーションおよび検証ロジックと結合するためです。

アドバイス:プレゼンテーションにEFエンティティを使用しないでください。データ注釈付きの特別なビューモデルを使用し、コントローラがエンティティからビューモデルを準備できるようにします。逆もまた同様です。間もなく、マッピングで検証が1:1でない場合や、エンティティタイプで提供されているデータより多くのデータを必要とする状況が発生することがあります。ビューモデルを使用すると、これらの状況はそれらによって処理されます。

+0

...しかし、私は前倒しの下流のシステム統合テストのために要求されたテスト用UIをサポートするために、これを使用している、正しいアプローチだろう"HasMaxLength"のようなマッピング?値が長ければ、SQLサーバは書き込みが試みられればそれを拒否し、 'string'型は長さの制限がないので読み込みには関係ありません。実際にこのマッピングは何ですか? –

+0

これは古い質問ですが、将来の読者のために追加すると思いました。 1つ目の理由は、まずコードを使用してデータベースを作成すると、目的の長さなどを知る必要があるcreate table文を作成する際に流暢なapi/dataアノテーションが使用されることです。 – Kate

3

私はこれをしばらくは苦労しましたが、これは往復を必要とするためクライアントの検証ではありませんが、標準テンプレートの検証要約とメッセージヘルパーの恩恵を受けることができます。あなたはここに複数のエンティティを保存する場合

try { 

    //This does not pick up fluent validation failures 
    if (ModelState.IsValid) { 
     db.Entity.Add(entity); 
     db.SaveChanges(); 
     //Users want to create loads of my entities without seeing the index... 
     return RedirectToAction("Create"); 
    } 

} catch (DbEntityValidationException e) { 

    //Log errors 
    foreach (var result in e.EntityValidationErrors) { 
     foreach(var error in result.ValidationErrors){ 
      ModelState.AddModelError(error.PropertyName, error.ErrorMessage); 
     } 
    } 

} 

//return to view with current model + validation errors 
return View(entity) 

これはもちろん、もう少し作業が必要になります。次のようにキャッチし、ModelStateに結果のエラーを追加する - あなたのコントローラのアクションメソッド内では、単に試しであなたのSaveChanges()呼び出しをラップ。ラディスラフが示唆するようにビューモデルオブジェクトを使用して、もちろん

はなぜEFも必要ない

関連する問題