nhibernateセッション /アクティブレコード範囲のキャッスルアクティブレコード検証を無効にする方法はありますか
-
11-10-2019 - |
質問
Nhibernateセッション /アクティブレコード範囲のアクティブなレコード検証を無効にする方法はありますか?
多数のアイテムの削除を実行するシナリオがあります - 場合によっては、顧客は検証に合格しないデータベースにデータを持っています(新しい検証ルールが導入される前にキャプチャされた、またはデータベースなど)
削除すると、データベースの構築方法により、既存のエンティティの検証チェックが発生し、例外で失敗します - それらのエンティティの削除を防ぎます。
削除シナリオについては、トランザクション/セッション/スコープに関連するすべての検証を無効にしたいと思います。エンティティは内部で削除されていますが、これは可能ですか?
更新23/01/2011
検証を無効にするための簡単な検証アクティブレコードベースクラスを実装しました。
public class DisabledValidationProvider : IValidationProvider
{
public bool IsValid()
{
return true;
}
public bool IsValid(RunWhen runWhen)
{
return true;
}
public string[] ValidationErrorMessages
{
get { return null; }
}
public IDictionary PropertiesValidationErrorMessages
{
get { return null; }
}
}
public class DisableValidationScope : IDisposable
{
public DisableValidationScope()
{
Local.Data["DisableValidationScope"] = true;
}
public static bool IsValidationDisabled
{
get { return Local.Data["DisableValidationScope"] != null; }
}
public void Dispose()
{
Local.Data["DisableValidationScope"] = null;
}
}
public abstract class ScopeAwareValidationBase : ActiveRecordHooksValidationBase
{
static readonly IValidationProvider DisabledProvider = new DisabledValidationProvider();
protected override IValidationProvider ActualValidator
{
get
{
if (DisableValidationScope.IsValidationDisabled)
{
return DisabledProvider;
}
return base.ActualValidator;
}
}
}
私のActivereCordモデルは、ScopeawarevalidationBaseから継承し、その後、トランザクションコードを中心に使用してステートメントを採用するだけで、おやつが機能します。
using (new DisableValidationScope())
{
// do transactional thing...
}
解決
私はオーバーライドを検討します ActualValidator
プロパティ、あなたはどちらもできます:
- セッターを提供して、コードが検証ごとに検証を適用するかどうかを決定できるようにします。
- (より良い)検証を適用するかどうかを決定する現在のSessionscopeに関連付けられたコンテキストを調べます。
検証を無効にするために、常にisValid()などにtrueを返すダミーivalidationProviderを返します。
所属していません StackOverflow