Есть ли способ отключить проверку активной записи Castle для области nhibernate / области активной записи

Есть ли способ отключить проверку Active Record для сеанса 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...
}

1 ответ

Решение

Я бы посмотрел на переопределение ActualValidator собственности, вы могли бы либо:

  • предоставить установщик, позволяющий вашему коду решать, применять проверку или нет для каждого отдельного экземпляра, или
  • (лучше) искать некоторый контекст, связанный с текущим SessionScope, который решает, применять проверку или нет.

Чтобы отключить проверку, вы должны вернуть фиктивный IValidationProvider, который всегда возвращал true для IsValid() и т. Д.

Другие вопросы по тегам