NHibernate: como duplicar um registro
Nesta semana que passou perdi algumas horas para descobrir como duplicar um registro utilizando o NHibernate.
Basicamente eu precisava adicionar ao cadastro de Tarefas a função de duplicar uma determinada tarefa.
Existem duas maneiras para fazer isso usando o NHibernate:
- Carregar um objeto Tarefa da base, criar um novo objeto Tarefa, popular ele com as informações do objeto carregado, gerar uma nova ID e persistí-lo. Algo mais ou menos assim:
1 Tarefa t1 = TarefaDAL.Get(1); 2 Tarefa t2 = new Tarefa(); 3 t2.Id = TarefaDAL.GetNextId(); 4 t2.Descricao = t1.Descricao; 5 TarefaDAL.Save(t1);
Ok, simples de ser feito quando o objeto tem poucas propriedades e é 100% certo que nunca será adicionada ou removida uma outra (isso é improvável em 99% dos casos).
- Carregar um objeto Tarefa da base, desvincular ele da Session, gerar um novo ID e salvá-lo.
1 Tarefa t = TarefaDAL.Get(1); 2 Session.Evict(t); 3 t.Id = TarefaDAL.GetNextId(); 4 TarefaDAL.Save(t);
Muito mais simples que a primeira versão e sem dúvida alguma muito mais prático também, pois esta rotina nunca irá mudar independente de quantas propriedades a classe Tarefa tiver.
O método Evict da ISession remove uma determinada instância do cache da session. Se o código acima for executado sem a chamada deste método, ao executar o Save(t), nenhuma alteração será feita no registro que está na base.
Fica aí a dica então: quando precisar duplicar um objeto, use o Evict para desvinculá-lo da sessão e após isso fazer o INSERT.
Até +!




Deixe o seu comentário