Gibt es eine Möglichkeit zu deaktivieren Castle Active Record Validierung für einen nhibernate Sitzung / aktiv Rekordumfang

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

Frage

Gibt es eine Möglichkeit zu deaktivieren Active Record Validierung für einen nhibernate Sitzung / aktiven Datensatz Umfang?

Ich habe ein Szenario, in dem wir Löschen eine große Anzahl von Elementen durchführen - und in einigen Fällen Kunden Daten in ihrer Datenbank, die die Überprüfung nicht bestanden wird (es wurde vor den neuen Validierungsregeln erfaßt eingeführt oder durch manuelle Manipulation der Datenbank etc.)

Beim Löschen aufgrund der Art und Weise der Datenbank aufgebaut ist, treten einige Validierungsprüfungen an bestehenden Einheiten, und nicht mit einer Ausnahme -. Die Löschung dieser Unternehmen zu verhindern

Für das Löschen Szenario möchten wir alle Validierung von deaktivieren mit der Transaktion / Session / Umfang assoziierte auftretende Einheiten innerhalb gelöscht werden, ist das möglich?

Update 23.01.2011

Implementiert eine einfache Validierung aktive Datensatz Basisklasse für die Validierung zu deaktivieren:

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

Meine Active Modelle erben von ScopeAwareValidationBase und dann kann ich emplot nur eine using-Anweisung um meinen Transaktionscode, arbeitet ein Genuss.

using (new DisableValidationScope()) 
{
    // do transactional thing...
}
War es hilfreich?

Lösung

ich in dem Überschreiben der ActualValidator Eigenschaft aussehen würde, dort können Sie entweder:

  • bietet einen Setter, Ihren Code entscheiden zu lassen, ob die Validierung anzuwenden oder nicht auf einer pro-Instanz-Basis oder
  • (besser) einige Kontext der aktuellen SessionScope zugeordnet nachschauen, ob die Validierung anzuwenden entscheidet oder nicht.

zu deaktivieren Validierung, dann würden Sie einen Dummy-IValidationProvider zurückkehren, dass immer wahr zurück zu IsValid (), etc.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top