Мне нужно перехватить метод Save, выполнить некоторые проверки, изменить некоторые свойства и затем отпустить его снова в обычном режиме.
Как я могу это сделать?
Спасибо! Алекс
Мне нужно перехватить метод Save, выполнить некоторые проверки, изменить некоторые свойства и затем отпустить его снова в обычном режиме.
Как я могу это сделать?
Спасибо! Алекс
Я бы рекомендовал добавить следующие частичные методы, которые будут запускаться до их фактического действия:
OnSave(CancelEventArgs e);
OnAdd(CancelEventArgs e);
OnUpdate(CancelEventArgs e);
OnDelete(CancelEventArgs e);
Это не событие, но я бы все равно использовал CancelEventArgs, он дружелюбный, люди знают его и знают, как его использовать, и с его помощью фактическое действие можно отменить из частичных методов.
Эти два тоже должны быть добавлены к списку существующих, которые срабатывают после их фактического действия:
OnAdded();
OnUpdated();
Мне не нравится это имя OnAdded (), но если вместо Insert было принято Add, мы должны его придерживаться.
Вот и все ... С этими частичными элементами, я думаю, мы охватываем все до и после реальных методов сохранения данных, что дает нам большую гибкость, чтобы делать все, что мы хотим, с нашими данными.
Я могу реализовать это, но я всегда боюсь касаться файлов 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
}
}