1

Gibt es eine Möglichkeit, Active Record Validierung für eine Nhibernate-Sitzung/aktiven Datensatzbereich zu deaktivieren?Gibt es eine Möglichkeit, Castle Active Record-Validierung für eine Nhibernate-Sitzung/aktiven Datensatz Geltungsbereich zu deaktivieren

ich ein Szenario haben, wodurch wir Löschung einer großen 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 der neuen Validierungsregeln erfasst werden eingeführt oder durch manuelle Manipulation der Datenbank usw.)

Beim Löschen werden aufgrund der Art und Weise, wie die Datenbank erstellt wird, einige Validierungsprüfungen für vorhandene Entitäten ausgeführt, die mit einer Ausnahme fehlschlagen und das Löschen dieser Entitäten verhindern.

Für das Löschszenario möchten wir alle Validierungen deaktivieren, die mit der Transaktion/Sitzung/dem Bereich verbunden sind, in dem die Entitäten gelöscht werden, ist das möglich?

-Update 23.01.2011

Implementiert eine einfache Validierung aktiven Datensatz Basisklasse zur Deaktivierung der Validierung:

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 von ScopeAwareValidationBase erben und dann kann ich emplot nur eine using-Anweisung Um meinen Transaktionscode herum funktioniert ein Leckerbissen.

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

Antwort

2

ich in dem Überschreiben die ActualValidator Eigenschaft aussehen würde, könnte man entweder:

  • einen Setter bieten, Ihren Code entscheiden zu lassen, ob die Validierung anzuwenden oder nicht auf einer pro-Instanz Basis, oder
  • (besser) suchen Sie nach einem Kontext, der dem aktuellen SessionScope zugeordnet ist und entscheidet, ob die Validierung angewendet werden soll oder nicht.

Validierung zu deaktivieren, würden Sie einen Dummy IValidationProvider zurück, die immer treu IsValid() zurückgegeben usw.

+0

Danke, das ich in der richtigen Richtung - nur einen einfachen Rahmen implementieren + überprüfen und es ist gut genug für das, was ich brauche. – Bittercoder