nhibernate セッション / アクティブ レコード スコープのアクティブ レコード検証を無効にする方法はありますか?
多数のアイテムの削除を実行しているシナリオがあります。場合によっては、顧客のデータベースに検証に合格しないデータがあります (新しい検証ルールが導入される前にキャプチャされたか、またはデータベースなど)
削除すると、データベースの構築方法が原因で、既存のエンティティの検証チェックが発生し、例外が発生して失敗し、それらのエンティティの削除が妨げられます。
削除のシナリオでは、エンティティが削除されるトランザクション/セッション/スコープに関連するすべての検証を無効にしたいと考えていますが、これは可能ですか?
2011/01/23 更新
検証を無効にするための単純な検証アクティブ レコード基本クラスを実装しました。
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 ステートメントを配置するだけでうまくいきます。
using (new DisableValidationScope())
{
// do transactional thing...
}