Digamos que em determinado caso, ao salvar um objeto Persist, nós queiramos criar uma espécie de "trigger" na aplicação que execute uma deleção de determinados registros logo após a inserção de nosso objeto Persist. É normal implementar tal cenário usando uma transação, pois não iríamos querer deletar nenhum registro sem ter a certeza que o objeto foi inserido com sucesso ou vice-versa.

Vamos imaginar a seguinte implementação.

Na nossa página dentro de um evento qualquer de botão:

var city = new City();
city.Name = "João Pessoa";
city.Save();

sempre que formos inserir uma nova cidade precisamos garantir que não existam logs para esta cidade no banco de dados. Para isso, basta dar um override no evento, OnInserted e dentro da classe City.cs da seguinte forma:

protected override void OnInserted(object sender, EventArgs e)
{
//
// use a mesma referência do command do objeto
//
var command = this.Commmand;
//
// limpe os parâmetros, podem haver itens já utilizados
//
command.ClearParameters();
command.AddWithValue("@Name", Name);
command.ExecuteNonQuery("DELETE * FROM CityLogs where Name = @Name");

base.OnInserted(sender, e);

}

Repare que o Command que usamos é o mesmo da instância do objeto Persist, garantindo assim que os commandos sejam executados dentro da transação do objeto. Um detalhe importante ao fazer isso, é limpar os parâmetros.

Fazendo desta forma, o commando de "Delete * from... " só será "comitado" se o objeto for comitado também, e um rollback será processado caso algo dê errado com o Save do objeto.

Last edited Mar 9, 2010 at 2:46 PM by ivanpaulovich, version 1

Comments

No comments yet.