¿Hay una manera de desactivar la validación del registro activo Castillo en un ámbito de registro de la sesión nhibernate / activo

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

Pregunta

¿Hay una manera de desactivar validación del registro activo para un alcance registro de la sesión nhibernate / activo?

Tengo un escenario en el que estamos llevando a cabo la eliminación de un gran número de elementos - y en algunos casos, los clientes tienen datos en su base de datos que no pasa la validación (que fue capturado antes de nuevas reglas de validación de ser introducido, o debido al manual manipulación de la base de datos, etc.)

Al eliminar, debido al modo en que se construye la base de datos, se producen algunas comprobaciones de validación sobre entidades existentes, y fallan con una excepción -. Prevención de la supresión de esas entidades

Para el escenario de eliminación nos gustaría desactivar toda la validación que se produzcan asociado a la transacción / sesión / alcance las entidades están siendo borrados dentro, ¿es esto posible?

Actualización 23/01/2011

Implementación de una clase base activa simple registro de validación para deshabilitar la validación:

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;
        }
    }
}

Mi modelos ActiveRecord heredan de ScopeAwareValidationBase y entonces sólo pueden emplot una declaración utilizando alrededor de mi código de transacción, trabaja un convite.

using (new DisableValidationScope()) 
{
    // do transactional thing...
}
¿Fue útil?

Solución

Me vería en anulando la propiedad ActualValidator, no se podía ya sea:

  • proporcionan un organismo, para que su código de decidir si se debe aplicar la validación o no en función de cada caso, o
  • (mejor) mirar hacia arriba un poco de contexto asociado a la sessionScope corriente que decide si se debe aplicar la validación o no.

Para desactivar la validación, se volvería un IValidationProvider ficticia que siempre se devuelve fiel a IsValid (), etc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top