Есть ли способ отключить проверку активной записи замка для сеанса Nhibernate / Active Record Scope
-
11-10-2019 - |
Вопрос
Есть ли способ отключить валидацию активной записи для сеанса 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 () и т. Д.