Frage

Ich brauche die Save-Methode abzufangen, einige Validierungen tun, einige Eigenschaften ändern und es dann wieder normal gehen lassen.

Wie kann ich das tun?

Danke! Alex

War es hilfreich?

Lösung

Ich würde empfehlen, die folgenden Teil Methoden hinzufügen, bevor sie ihre eigentliche Aktion gefeuert werden:

OnSave(CancelEventArgs e); 
OnAdd(CancelEventArgs e); 
OnUpdate(CancelEventArgs e); 
OnDelete(CancelEventArgs e);

Dies ist kein Ereignis, aber ich würde CancelEventArgs sowieso verwenden, es ist freundlich, die Leute wissen es und wissen, wie es zu benutzen und damit die eigentliche Aktion kann aus den Teilverfahren aufgehoben werden.

Diese beiden sollten auch hinzugefügt werden, um die Liste der vorhandenen diejenigen, die nach ihrer tatsächlichen Wirkung Feuer:

OnAdded(); 
OnUpdated();

Ich mag es nicht, dass OnAdded () Name, aber wenn Add statt Insert angenommen wurde, dann müssen wir dabei bleiben.

Und das ist es ... Mit diesem partials denke ich, dass wir alle befores und after der tatsächlichen Daten Persistenzmethoden decken uns eine größere Flexibilität, um zu tun, was wir uns unsere Daten wollen.

Ich kann dies umzusetzen, aber ich habe immer Angst, die tt-Dateien zu berühren, da zukünftige Updates alle Änderungen meine Gewohnheit abstreifen wird! :)

Danke! Alex

Andere Tipps

In 2.x gab es ein Before und VorAktualisierung Methoden, die Sie außer Kraft setzen können.

Ich glaube, Sie brauchen eine OnSaving Methode in der ActiveRecord.tt-Datei hinzuzufügen. Legen Sie diese neben dem OnSaved () sig:

  partial void OnSaving();

Dann ist Ihre ActiveRecord.tt Datei aktualisieren. 2 Änderungen, die ich sehe:

die Update-Methode Aktualisieren

    public void Update(IDataProvider provider)
    {      
    <#if(tbl.Columns.Any(x=>x.Name=="ModifiedBy")){#>
        if(String.IsNullOrEmpty(this.ModifiedBy))
            this.ModifiedBy=Environment.UserName;
     <#}#>
    <#if(tbl.Columns.Any(x=>x.Name=="ModifiedOn")){#>
        this.ModifiedOn=DateTime.Now;
     <#}#>

       **OnSaving();**

        if(this._dirtyColumns.Count>0)
            _repo.Update(this,provider);
        OnSaved();
   }

und dann die Add-Methode aktualisieren

public void Add(IDataProvider provider)
{ 
<#if(tbl.Columns.Any(x=>x.Name=="CreatedOn")){#>

            this.CreatedOn=DateTime.Now;
<#}#>
<#if(tbl.Columns.Any(x=>x.Name=="CreatedBy")){#>
            if(String.IsNullOrEmpty(this.CreatedBy))
                this.CreatedBy=Environment.UserName;
<#}#>
<#if(tbl.Columns.Any(x=>x.Name=="ModifiedOn")){#>
            this.ModifiedOn=DateTime.Now;
<#}#>
<#if(tbl.Columns.Any(x=>x.Name=="ModifiedBy")){#>
            if(String.IsNullOrEmpty(this.ModifiedBy))
                this.ModifiedBy=Environment.UserName;
<#}#>

            **OnSaving();**            

            var key=KeyValue();
            if(key==null){
                var newKey=_repo.Add(this,provider);
                this.SetKeyValue(newKey);
            }else{
                _repo.Add(this,provider);
            }
            SetIsNew(false);
            OnSaved();
}

Schließlich müssen Sie Ihre Teil-Klassen verwenden, um den OnSaving () -Methode außer Kraft zu setzen, die Werte zu aktualisieren. Ich mache etwas sehr ähnlich, da ich nicht die Konvention von ModifiedBy und createdon mit (ich habe Unterstrichen dort).

Sie können die Teil-Klasse-Mechanismus verwenden, um Ihre eigene Version von Speichern zu schaffen, die Validierung tut und ruft die SubSonic Speichern erzeugt. z.

namespace YourNameSpace
{
   public partial class YourTable : IActiveRecord
   { 
       public void MySave()
       {
           // insert your validation here
           this.Save()
       }
   }
}

Jede Active Klasse kommt mit einem Teil „OnSave ()“ Methode so alles, was Sie tun müssen, ist ein teilweise zu erstellen und dann überschreiben den Teil OnSave () - wie in LINQ to SQL:

public partial class MyClass{
   partial OnSave(){
   //magic
   }

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