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

Есть ли способ отключить проверку 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 Ответ

2 голосов
/ 17 января 2011

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

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

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

...