是否有一种方法可以禁用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...
}
有帮助吗?

解决方案

我会考虑覆盖 ActualValidator 财产,您可以在那里:

  • 提供一个设置器,以便您的代码决定是否按照统计申请验证,还是
  • (更好)查找与当前的SessionsCope相关的某些上下文,该上下文决定是否应用验证。

为了禁用验证,您将返回一个始终返回到Isvalid()和等的虚拟ivalidationProvider

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top