C'è un modo per disattivare la convalida Castello Active Record per una sessione di NHibernate / ambito record attivo
-
11-10-2019 - |
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...
}
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.