4

Save メソッドをインターセプトし、いくつかの検証を行い、いくつかのプロパティを変更してから、通常どおりに戻す必要があります。

これどうやってするの?

ありがとう!アレックス

4

4 に答える 4

4

実際のアクションの前に、次の部分メソッドを追加して起動することをお勧めします。

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

これはイベントではありませんが、とにかく CancelEventArgs を使用します。それは友好的であり、人々はそれを知っており、その使用方法を知っており、実際のアクションを部分メソッドからキャンセルできます。

これらの 2 つは、実際のアクションの後に発火する既存のもののリストにも追加する必要があります。

OnAdded(); 
OnUpdated();

その OnAdded() という名前は好きではありませんが、Insert の代わりに Add が採用された場合は、それに固執する必要があります。

それだけです... これらのパーシャルを使用して、実際のデータ永続化メソッドの前後をすべてカバーしていると思います。これにより、データに対して必要なことを柔軟に行うことができます。

これを実装することはできますが、将来の更新ですべてのカスタム変更が消去されるため、tt ファイルに触れることを常に恐れています。:)

ありがとう!アレックス

于 2009-08-23T08:52:07.583 に答える
1

2.x では、オーバーライドできる BeforeInsert メソッドと BeforeUpdate メソッドがありました。

ActiveRecord.tt ファイルに OnSaving メソッドを追加する必要があると思います。これを OnSaved() sig の隣に配置します。

  partial void OnSaving();

次に、ActiveRecord.tt ファイルを更新します。私が見る2つの変更:

Update メソッドを更新する

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

Add メソッドを更新します。

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

最後に、部分クラスを使用して OnSaving() メソッドをオーバーライドし、値を更新する必要があります。modifiedby と createdon の規則を使用していないため、非常に似たようなことをしています (そこにアンダースコアがあります)。

于 2009-08-25T22:56:15.037 に答える
0

部分クラス メカニズムを使用して、検証を行い、SubSonic によって生成された Save を呼び出す独自のバージョンの Save を作成できます。例えば

namespace YourNameSpace
{
   public partial class YourTable : IActiveRecord
   { 
       public void MySave()
       {
           // insert your validation here
           this.Save()
       }
   }
}
于 2009-08-18T23:37:07.130 に答える
0

各 ActiveRecord クラスには部分的な「OnSave()」メソッドが付属しているため、Linq To Sql と同様に、部分的なものを作成してから部分的な OnSave() をオーバーライドするだけです。

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

}
于 2009-08-21T22:19:14.230 に答える