Pregunta

necesito para interceptar el método Save, hacer algunas validaciones, alterar algunas propiedades y luego dejarlo ir de nuevo con normalidad.

¿Cómo puedo hacer esto?

Gracias! Alex

¿Fue útil?

Solución

Yo recomendaría la adición de los siguientes métodos parciales para ser disparado antes de su acción real:

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

Esto no es un evento sino que usaría CancelEventArgs todos modos, es amable, la gente lo conoce y sabe cómo usarlo y con él la acción real pueden ser canceladas a partir de los métodos parciales.

Estos dos deben añadirse también a la lista de los existentes que se activan después de su acción real:

OnAdded(); 
OnUpdated();

No me gusta que OnAdded (), por nombrar sólo si se adoptó Agregar lugar de inserción a continuación, hay que seguir con ella.

Y eso es todo ... Con estos parciales creo que cubrimos todas las befores y afters de los métodos actuales de persistencia de datos que nos da una mayor flexibilidad para hacer lo que queramos que nuestros datos.

puedo aplicar esto, pero siempre tengo miedo de tocar los archivos tt debido a futuras actualizaciones se limpie todos mis cambios personalizados! :)

Gracias! Alex

Otros consejos

En 2.x, había una BeforeInsert y BeforeUpdate métodos que podría anular.

Creo que es necesario agregar un método OnSaving en el archivo ActiveRecord.tt. Coloque este lado del OnSaved () sig:

  partial void OnSaving();

A continuación, actualizar el archivo ActiveRecord.tt. 2 cambios que veo:

Actualizar el método 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();
   }

y luego actualizar el método 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();
}

Por último, es necesario utilizar sus clases parciales para reemplazar el método OnSaving () para actualizar los valores. Estoy haciendo algo muy similar ya que no estoy usando la convención de ModifiedBy y createdon (tengo guiones allí).

Puede utilizar el mecanismo de clase parcial para crear su propia versión de Save, que hace la validación y llama a la SubSonic genera Guardar. por ejemplo.

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

Cada clase ActiveRecord viene con un parcial de "OnSave ()" método de todo lo que tiene que hacer es crear un parcial y luego anular el OnSave parcial () - al igual que en LINQ to SQL:

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

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top