は、ここに私のシナリオです:NHibernateは、検証ロジックとAutoDirtyCheck
私はopenningとのIHttpModule(PreRequestHandlerExecuteとPostRequestHandlerExecute)でセッションを閉じて、NHibernateはを使用しています。
Ninjectが私のすべてのリポジトリにセッションを挿入してくれてとても満足しています。
は今私のエンティティ(コードが簡素化)のいずれかに更新したとします
コントローラー:
User user = _userService.GetUser(id);
user.Name = "foo";
user.Email = "[email protected]";
user.Group = _groupService.GetGroup(idGroup);
if(_userService.Edit(user)) {
RedirectToAction("Index");
}
else {
return View(user);
}
サービス:
if(ValidateUser(user) {
return _rep.Update(user);
}
return false;
のvalidateUserは、検証ロジックを実行し、任意のエラーを挿入していますコントローラ内のModelStateのラッパーであるIValidationDictionaryに格納されます。
これまでのところ、すべてのエラー(もしあれば)が得られ、ビューに表示することができます。ここで
に問題が来る:私は、エラー(たとえば、名前なし)をユーザーに保存しようとすると
、メソッド_rep.Update(ユーザー)が呼び出されることはありませんが、ユーザーが保存されますとにかく
nhibernateのAutoDirtyCheckは、メモリ内のエンティティを変更すると自動的にデータベースに保持されることを意味します。
非常に強力な機能私は同意しますが、私のセッションはPostRequestHandlerExecuteでコミットされているので、私の無効なエンティティはとにかく保存されています。
私はunhaddinsを使用して、この動作を削除しようとした、それが働いていたが、私は親だけを保存するときに、私の子オブジェクトは自動的に保存されていない:(
それを解決するために、どのように?
検証ロジックを別の場所に置いていますか?おそらくエンティティクラス自体にありますか(私は非常に離れているのが好きです)。
ありがとうございます。
私はあなたのソリューションが好きです。私はより多くの意見を見たいと思います。 1〜2日で誰も答えなければ、あなたはVを手に入れます:) – andrecarlucci
男、問題です。これにより、既存のユーザー名でユーザーを更新しようとしても、同じ方法で重複したエンティティエラーが発生することはありません。あなたはこれにどのように対処していますか? – andrecarlucci
validator.Validate(object toValidate)(擬似コード)は、渡されたオブジェクトのタイプ(この場合はviewmodel型)に応じて、バリデータクラスインスタンスを作成するバリデータファクトリを呼び出します。バリデータークラスは、バリデーターから継承するクラスです。検証する必要のあるモデルごとに別々のバリデータークラスを作成します。バリデータファクトリは、IoC/Serviceロケータを使用してバリデータクラスのインスタンスを解決します。バリデータークラスにdataacessクラスを挿入して、ユーザー名が存在するかどうかを調べることができます。 –
Paco