我需要拦截 Save 方法,进行一些验证,更改一些属性,然后让它再次正常运行。
我怎样才能做到这一点?
谢谢!亚历克斯
我需要拦截 Save 方法,进行一些验证,更改一些属性,然后让它再次正常运行。
我怎样才能做到这一点?
谢谢!亚历克斯
我建议在实际操作之前添加以下要触发的部分方法:
OnSave(CancelEventArgs e);
OnAdd(CancelEventArgs e);
OnUpdate(CancelEventArgs e);
OnDelete(CancelEventArgs e);
这不是一个事件,但无论如何我都会使用 CancelEventArgs,它很友好,人们知道它并知道如何使用它,并且可以从部分方法中取消实际操作。
这两个也应该添加到在实际操作后触发的现有列表中:
OnAdded();
OnUpdated();
我不喜欢那个 OnAdded() 名称,但如果采用 Add 而不是 Insert,那么我们必须坚持使用它。
就是这样......通过这些部分,我认为我们涵盖了实际数据持久性方法的所有前后,使我们能够更灵活地做任何我们想要的数据。
我可以实现这一点,但我总是害怕接触 tt 文件,因为未来的更新会抹去我所有的自定义更改!:)
谢谢!亚历克斯
在 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 的约定(我在那里有下划线)。
您可以使用部分类机制来创建您自己的 Save 版本,它会进行验证并调用 SubSonic 生成的 Save。例如
namespace YourNameSpace
{
public partial class YourTable : IActiveRecord
{
public void MySave()
{
// insert your validation here
this.Save()
}
}
}
每个 ActiveRecord 类都带有一个部分的“OnSave()”方法,所以您需要做的就是创建一个部分,然后覆盖部分 OnSave() - 就像在 Linq To Sql 中一样:
public partial class MyClass{
partial OnSave(){
//magic
}
}