C'è un modo per disattivare la convalida Castello Active Record per una sessione di NHibernate / ambito record attivo

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

Domanda

C'è un modo per disattivare la convalida Active Record per un / ambito record attivo sessione di NHibernate?

Ho uno scenario in cui si sta eseguendo l'eliminazione di un gran numero di elementi - e in alcuni casi i clienti presentano dati nel loro database che non passa la convalida (è stato catturato prima di nuove regole di convalida in fase di introduzione, oppure a causa di manuali manipolazione del database, ecc.)

Quando si elimina, a causa del modo in cui il database è costruito, alcuni controlli di validazione su entità esistenti si verificano, e non riescono con un'eccezione -. Prevenire la cancellazione di quelle entità

Per lo scenario di eliminazione vorremmo disabilitare tutta la convalida si verifichi associato alla transazione / sessione / portata le entità vengono eliminati all'interno, è possibile?

Aggiornamento 23/01/2011

Implementata una semplice convalida attiva classe base record per la disattivazione di convalida:

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

Il mio modelli ActiveRecord ereditano da ScopeAwareValidationBase e quindi posso solo emplot un'istruzione using intorno al mio codice di transazione, funziona a meraviglia.

using (new DisableValidationScope()) 
{
    // do transactional thing...
}
È stato utile?

Soluzione

Mi piacerebbe guardare in sovrascrivendo la proprietà ActualValidator, ci si potrebbe o:

  • fornire un setter, di lasciare il vostro codice di decidere se applicare la convalida o meno su una base per-esempio, o
  • (meglio) cercare un po 'di contesto associato alla SessionScope corrente che decide se applicare la convalida o meno.

Per la convalida disabilitare, si sarebbe tornato un IValidationProvider fittizio che sempre restituito fedele alla IsValid (), ecc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top