Есть ли способ отключить проверку активной записи замка для сеанса Nhibernate / Active Record Scope

StackOverflow https://stackoverflow.com/questions/4707787

Вопрос

Есть ли способ отключить валидацию активной записи для сеанса Nhibernate Session / Active Record?

У меня есть сценарий, согласно которому мы выполняем удаление большого количества элементов - и в некоторых случаях у клиентов есть данные в своей базе данных, которые не будут проходить проверку (оно было завоевано до введения новых правил проверки или из -за ручной манипуляции база данных и т. Д.)

При удалении, благодаря тому, как строится база данных, некоторые проверки проверки на существующих объектах происходят и не склонны к исключению - предотвращение удаления этих сущностей.

Для сценария удаления мы хотели бы отключить всю валидацию из происходящей связанной с транзакцией/сеансом/сферой, в которых объекты удаляются внутри, возможно ли это?

Обновление 23/01/2011

Реализовано простой базовый класс Active Active Active Record для отключения проверки:

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, который решает, применять ли проверка или нет.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top