Ich muss die Save-Methode abfangen, einige Validierungen durchführen, einige Eigenschaften ändern und dann wieder normal laufen lassen.Wie überschneiden Sie die Speichermethode auf ActiveRecord?
Wie kann ich das tun?
Danke! Alex
Ich muss die Save-Methode abfangen, einige Validierungen durchführen, einige Eigenschaften ändern und dann wieder normal laufen lassen.Wie überschneiden Sie die Speichermethode auf ActiveRecord?
Wie kann ich das tun?
Danke! Alex
würde ich empfehlen die folgenden Teil Methoden Zugabe vor ihrer eigentlichen Wirkung entlassen werden:
OnSave(CancelEventArgs e);
OnAdd(CancelEventArgs e);
OnUpdate(CancelEventArgs e);
OnDelete(CancelEventArgs e);
Dies ist kein Ereignis, aber ich würde auf jeden Fall CancelEventArgs verwenden, es ist freundlich, wissen die Leute es und k nun wie man es benutzt und damit kann die eigentliche Aktion aus den Teilmethoden abgebrochen werden.
Diese beiden sollten auch in die Liste der bestehenden hinzugefügt werden, die nach ihrer tatsächlichen Wirkung Feuer:
OnAdded();
OnUpdated();
Ich mag es nicht, dass OnAdded() Name, aber wenn Add anstelle von Insert angenommen dann wir müssen dabei bleiben.
Und das ist es ... Mit diesen Teiltönen, denke ich, decken wir alle Vor-und Nachläufe der tatsächlichen Datenpersistenz-Methoden geben uns eine größere Flexibilität zu tun, was wir wollen, unsere Daten.
Ich kann dies implementieren, aber ich habe immer Angst, die TT-Dateien zu berühren, weil zukünftige Updates alle meine benutzerdefinierten Änderungen abwischen werden! :)
Danke! Alex
Sie können den partiellen Klassenmechanismus verwenden, um Ihre eigene Version von Save zu erstellen, die Validierung durchführt und die von SubSonic erzeugte Save aufruft. z.B.
namespace YourNameSpace
{
public partial class YourTable : IActiveRecord
{
public void MySave()
{
// insert your validation here
this.Save()
}
}
}
Hallo Kumpel, danke für die Antwort. Dies ist nicht wirklich eine gute Option, weil es leicht zu vergessen ist, gibt es eine benutzerdefinierte Speicherung und verwenden Sie die ActiveRecord-Standard. Ich brauche keine Überladung, ich brauche etwas wie eine OnSave-Methode (Object Sender, CancelEventArgs e), wo ich den Speichervorgang validieren, ändern oder sogar abbrechen kann, unabhängig von der Speicherüberlastung, die ich verwende. Ich habe gefragt, weil ich etwas vermissen könnte, aber wenn nicht muss ich implementieren, wenn ich selbst. – AlexCode
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
}
}
Hallo Rob, danke für die Antwort. Die Teilmethode verfügbar ist OnSaved(), die angibt, dass nach den Anweisungen Save() aufgerufen wird. Wann wird das tatsächlich ausgelöst, vor oder nach dem eigentlichen Speichern()? Danke! Alex – AlexCode
Ich sah es auf Code ... es heißt am Ende der Add & Update-Methoden und das löst nicht mein Problem. Ich muss die Entitätsdaten vor dem Speichern ändern. Ich werde eine mögliche Lösung hinzufügen, weil hier Kommentare nur 600 Zeichen haben können. – AlexCode
In 2.x gab es eine BeforeInsert- und BeforeUpdate-Methode, die Sie überschreiben konnten.
Ich denke, Sie müssen eine OnSaving-Methode in der ActiveRecord.tt-Datei hinzufügen. Legen Sie diese neben dem OnSaved() sig:
partial void OnSaving();
dann Ihre ActiveRecord.tt Datei aktualisieren. 2 Änderungen, die ich sehe:
Aktualisieren Sie die Update-Methode
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
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 aktualisieren, müssen Sie Ihre Teil-Klassen verwenden, um den OnSaving() -Methode außer Kraft zu setzen um die Werte zu aktualisieren. Ich mache etwas sehr ähnliches, da ich nicht die Konvention von modifiedby und createdon verwende (ich habe es dort unterstrichen).
Ja ... das ist fast so. Ich habe es nur noch nicht getan, weil ich „Angst‘ der Zukunft Unterschall tt Updates bin. Wie Sie Ihre benutzerdefinierten Änderungen Handhabung sind? Eine andere Sache ist, dass ich die Änderungen vor der eigentlichen Aktion abzubrechen können Daher benötige ich die CancelEventArgs für die On * -Methoden – AlexCode
Sie haben wirklich keine Wahl.Wenn Sie das brauchen, müssen Sie die tt-Dateien bearbeiten.Ich möchte, dass OnSaving hinzugefügt wird auch die Standardvorlagen (etwas Ähnliches war in der vorherigen Version vorhanden, also besteht die Möglichkeit, dass es akzeptiert wird). Sie können ein Problem auf der SubSonic github-Website (unter dem Projekt subsonic-3/templates) posten hinzugefügt in einer späteren Version.Ich mag es nicht, die tt-Dateien auch zu bearbeiten (ich bleibe lieber dabei, nur teilweise Klassen wenn möglich zu machen), aber wenn Sie es brauchen, um zu arbeiten, dann werden Sie es tun müssen. –
Da Sie es abbrechen müssen, haben Sie nach einer Validate-Methode gesucht? Es existierte früher in 2.x und ich denke, es wurde aufgerufen, bevor die Befehle zum Einfügen/Aktualisieren gestartet wurden. Ich denke, es gab eine Möglichkeit für Sie, die Einfügung/Aktualisierung abzubrechen, indem Sie sie auf ungültig setzen. Ich bin neu bei 3, also habe ich nur die vorherige Version, um es zu vergleichen. –
ActiveRecord ist eine ziemlich "generische" Kopfzeile.Es gibt eine viel häufiger verwendete (und viele sagt besser) O/RM-Bibliothek, die auch das Wort verwendet; "ActiveRecord", wahrscheinlich aufgrund des Design Patterns, das Martin Fowler vor einigen Jahren mit diesem Namen geprägt hat. Also, obwohl du den Beitrag getaggt hast, damit die Leute verstehen, dass es Subsonic ist, von dem du sprichst, wäre es richtiger, Subsonic auch in der Kopfzeile hinzuzufügen ... –
Du hast recht ... völlig vergessen über das "generische" Umgebung stackoverflow ist. Wird nicht noch einmal passieren :) – AlexCode