如何在 SubSonic ORM 上截取 ActiveRecord 上的 save 方法?

发布于 2024-08-02 01:30:21 字数 88 浏览 5 评论 0原文

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

我怎样才能做到这一点?

谢谢! 亚历克斯

I need to intercept the Save method, do some validations, alter some properties and then let it go again normally.

How can I do this?

Thanks!
Alex

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

表情可笑 2024-08-09 01:30:21

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

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

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

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

OnAdded(); 
OnUpdated();

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

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

我可以实现这个,但我总是害怕接触 tt 文件,因为未来的更新将消除我所有的自定义更改! :)

谢谢!
亚历克斯

I would recommend adding the following partial methods to be fired before their actual action:

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

This isn't an event but I would use CancelEventArgs anyway, it's friendly, people know it and know how to use it and with it the actual action can be canceled from the partial methods.

These two should be added too to the list of the existing ones that fire after their actual action:

OnAdded(); 
OnUpdated();

I don't like that OnAdded() name but if Add was adopted instead of Insert then we must stick with it.

And that's it... With these partials I think we cover all the befores and afters of the actual data persistence methods giving us a greater flexibility to do whatever we want we our data.

I can implement this but I'm always afraid of touching the tt files because future updates will wipe off all my custom changes! :)

Thanks!
Alex

我是有多爱你 2024-08-09 01:30:21

在 2.x 中,您可以重写 BeforeInsert 和 BeforeUpdate 方法。

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

  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的约定(我在那里有下划线)。

In 2.x, there was a BeforeInsert and BeforeUpdate methods you could override.

I think you need to add an OnSaving method in the ActiveRecord.tt file. Place this next to the OnSaved() sig:

  partial void OnSaving();

Then update your ActiveRecord.tt file. 2 changes that I see:

Update the Update method

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

and then update the Add method

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

Finally, you need to use your partial classes to override the OnSaving() method to update the values. I'm doing something very similar since I'm not using the convention of modifiedby and createdon (I have underscores there).

拍不死你 2024-08-09 01:30:21

您可以使用分部类机制来创建您自己的 Save 版本,该版本会进行验证并调用 SubSonic 生成的 Save。 例如

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

You can use the partial class mechanism to create your own version of Save which does validation and calls the SubSonic generated Save. e.g.

namespace YourNameSpace
{
   public partial class YourTable : IActiveRecord
   { 
       public void MySave()
       {
           // insert your validation here
           this.Save()
       }
   }
}
云淡风轻 2024-08-09 01:30:21

每个 ActiveRecord 类都带有一个部分“OnSave()”方法,因此您需要做的就是创建一个部分,然后覆盖部分 OnSave() - 就像在 Linq To Sql 中一样:

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

}

Each ActiveRecord class comes with a partial "OnSave()" method so all you need to do is create a partial and then override the partial OnSave() - just like in Linq To Sql:

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

}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文