Esta semana publiquei alguns novos tópicos na nossa wiki sobre o Paulovich.Data. Nestes tópicos o assunto principal foi o tratamento de transações. Para mim ficou bem mais fácil, pois conheço o “ciclo de vida” de uma classe Persistente, ou seja, que herda de Persist (principal classe do framework). Por isso resolvi postar um diagrama conceitual deste mesmo ciclo e explicá-lo, em breve irei adicionar este e outros diagramas à wiki.

//// criamos uma cidade para ser inserida 
var city = new City();
city.Name = "João Pessoa";

//// podemos criar um objeto filho, como por exemplo um bairro
var district = new District();
district.Name = "Cruz das Armas";

//// adicionamos o objeto filho ao objeto pai
city.Districts.Add(district);

//// e mandamos salvar
city.Save();

Bom, basicamente, quando mandamos um objeto ser persistido. Nós chamamos o método Save(). Esse método já encapula os testes necessários para saber se o objeto fará uma inserção ou uma atualização no banco de dados. Isso porque, se um objeto foi criado a partir de um Id – var obj = new Objeto(id) – ou seja, foi recuperado do banco de dados, e teve suas propriedades alteradas e então o seu método Save() foi executado ele irá executar um UPDATE no banco. Se por outro lado o objeto foi construído sem nenhuma referência de Id, com um simples var obj = new Objeto() – por exemplo, ele então executará um INSERT.

Este processo ocorre internamente ao objeto da seguinte forma:

Como é possível perceber, todo objeto Persist trabalha usando transações, garantindo assim segurança na execução de comandos. Mas o que gostaria de atentar, é para os eventos disparados durante o processo. Com eles podemos implementar funcionalidades parecidas com o de “triggers” de banco de dados. Porém na camada de aplicação, centralizando dessa forma toda regra de negócio na mesma camanda. Como fiz neste outro exemplo, em que utilizei o evento OnInserted para limpar os possíveis logs de um registro.

Esse processo é bem parecido para o Save() de um objeto recuperado pelo id, porém ao invés de OnInserted, teremos os eventos OnUpdated ou OnUpdating sendo disparados e o mesmo acontece para o Delete. Então, mãos a obra… tenho certeza que vocês acharão muito útil estes eventos.

grande abraço