有没有办法为休眠会话/活动记录范围禁用活动记录验证?
我有一个场景,我们正在删除大量项目 - 在某些情况下,客户的数据库中的数据不会通过验证(它是在引入新的验证规则之前捕获的,或者由于手动操作数据库等)
删除时,由于数据库的构造方式,对现有实体进行了一些验证检查,并因异常而失败 - 阻止删除这些实体。
对于删除场景,我们希望禁用与正在删除实体的事务/会话/范围相关联的所有验证,这可能吗?
更新 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 语句,这是一种享受。
using (new DisableValidationScope())
{
// do transactional thing...
}