4

我需要拦截 Save 方法,进行一些验证,更改一些属性,然后让它再次正常运行。

我怎样才能做到这一点?

谢谢!亚历克斯

4

4 回答 4

4

我建议在实际操作之前添加以下要触发的部分方法:

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

这不是一个事件,但无论如何我都会使用 CancelEventArgs,它很友好,人们知道它并知道如何使用它,并且可以从部分方法中取消实际操作。

这两个也应该添加到在实际操作后触发的现有列表中:

OnAdded(); 
OnUpdated();

我不喜欢那个 OnAdded() 名称,但如果采用 Add 而不是 Insert,那么我们必须坚持使用它。

就是这样......通过这些部分,我认为我们涵盖了实际数据持久性方法的所有前后,使我们能够更灵活地做任何我们想要的数据。

我可以实现这一点,但我总是害怕接触 tt 文件,因为未来的更新会抹去我所有的自定义更改!:)

谢谢!亚历克斯

于 2009-08-23T08:52:07.583 回答
1

在 2.x 中,您可以覆盖 BeforeInsert 和 BeforeUpdate 方法。

我认为您需要在 ActiveRecord.tt 文件中添加 OnSaving 方法。将其放在 OnSaved() 信号旁边:

  partial void OnSaving();

然后更新您的 ActiveRecord.tt 文件。我看到的 2 个变化:

更新更新方法

    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

您可以使用部分类机制来创建您自己的 Save 版本,它会进行验证并调用 SubSonic 生成的 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()”方法,所以您需要做的就是创建一个部分,然后覆盖部分 OnSave() - 就像在 Linq To Sql 中一样:

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

}
于 2009-08-21T22:19:14.230 回答