1

有没有办法为休眠会话/活动记录范围禁用活动记录验证?

我有一个场景,我们正在删除大量项目 - 在某些情况下,客户的数据库中的数据不会通过验证(它是在引入新的验证规则之前捕获的,或者由于手动操作数据库等)

删除时,由于数据库的构造方式,对现有实体进行了一些验证检查,并因异常而失败 - 阻止删除这些实体。

对于删除场景,我们希望禁用与正在删除实体的事务/会话/范围相关联的所有验证,这可能吗?

更新 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...
}
4

1 回答 1

2

我会考虑覆盖该ActualValidator属性,您可以:

  • 提供一个设置器,让您的代码决定是否在每个实例的基础上应用验证,或者
  • (更好)查找与决定是否应用验证的当前 SessionScope 关联的一些上下文。

要禁用验证,您将返回一个始终向 IsValid() 等返回 true 的虚拟 IValidationProvider。

于 2011-01-17T00:24:11.223 回答