1

Y at-il un moyen de désactiver la validation Active Record pour une portée nhibernate session/active? J'ai un scénario dans lequel nous effectuons la suppression d'un grand nombre d'éléments - et dans certains cas, les clients ont des données dans leur base de données qui ne seront pas validées (elles ont été capturées avant l'introduction de nouvelles règles de validation ou Lors de la suppression, en raison de la construction de la base de données, certaines vérifications de validation sur les entités existantes se produisent, et échouent avec une exception - empêchant la suppression de ces entités.Existe-t-il un moyen de désactiver la validation Castle Active Record pour une portée nhibernate session/active

Pour le scénario de suppression, nous souhaitons désactiver toute validation associée à la transaction/session/portée dans laquelle les entités sont supprimées, est-ce possible?

Mise à jour 23/01/2011

Mise en œuvre 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; 
     } 
    } 
} 

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

using (new DisableValidationScope()) 
{ 
    // do transactional thing... 
} 

Répondre

2

je regarderais en remplaçant 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) recherchez un contexte associé au SessionScope actuel qui décide ou non d'appliquer une validation.

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

+0

Merci, qui m'a orienté dans la bonne direction - mettre en œuvre un simple champ + vérifier et il est Je travaille assez bien pour ce dont j'ai besoin. – Bittercoder

Questions connexes