Est-il un moyen de désactiver la validation de Castle Active Record pour une session NHibernate / champ d'enregistrement actif

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

Question

Y at-il un moyen de désactiver la validation Active Record pour une session NHibernate / champ d'enregistrement actif?

J'ai un scénario dans lequel nous effectuons la suppression d'un grand nombre d'articles - et dans certains cas, les clients ont données dans leur base de données qui ne passeront pas la validation (il a été capturé avant de nouvelles règles de validation étant introduite, ou en raison de manuel la manipulation de la base de données, etc.)

Lors de la suppression, en raison de la façon dont la base de données est construite, des contrôles de validation sur les entités existantes se produisent, et échouent avec une exception -. Empêchant la suppression de ces entités

Pour le scénario de suppression, nous voudrions désactiver toutes les validations de se produire associé à la transaction / séance / portée des entités sont supprimées au sein, est-ce possible?

Mise à jour 23/01/2011

Mise en place d'une simple validation classe de base d'enregistrement actif pour désactiver la validation:

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

Mon modèles ActiveRecord héritent de ScopeAwareValidationBase puis je peux emplot une déclaration à l'aide autour de mon code de transaction, fonctionne un régal.

using (new DisableValidationScope()) 
{
    // do transactional thing...
}
Était-ce utile?

La solution

Je regarde en redéfinissant la propriété ActualValidator, il vous pouvez soit:

  • fournir un poseur, de laisser votre code décider d'appliquer ou non la validation ou non sur une base par exemple, ou
  • (mieux) rechercher un contexte associé au SessionScope courant qui décide d'appliquer ou non la validation ou non.

Pour désactiver la validation, vous auriez un retour IValidationProvider factice qui revenait toujours fidèle à IsValid (), etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top