1

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...
}
4

1 に答える 1

2

プロパティをオーバーライドすることを検討しますActualValidator。そこでは、次のいずれかを実行できます。

  • セッターを提供して、インスタンスごとに検証を適用するかどうかをコードに決定させる、または
  • (より良い)検証を適用するかどうかを決定する現在のSessionScopeに関連付けられたコンテキストを検索します。

検証を無効にするには、IsValid()などに常にtrueを返すダミーのIValidationProviderを返します。

于 2011-01-17T00:24:11.223 に答える