[PersistenceConversational(MethodsIncludeMode =
MethodsIncludeMode.Implicit)]
public class Repositorio<T> : IRepositorio<T>
{
private readonly ISessionFactory nhFactory;
#region " Constructor "
public Repositorio(ISessionFactory factory)
{
nhFactory = factory;
}
#endregion
#region " Propiedades "
public ISession Sesion
{
get { return nhFactory.GetCurrentSession(); }
}
#endregion
#region " Métodos Publicos "
[PersistenceConversation(ConversationEndMode = EndMode.End)]
public void Actualizar(T entidad)
{
Sesion.SaveOrUpdate(entidad);
}
[PersistenceConversation(ConversationEndMode = EndMode.End)]
public void Eliminar(T entidad)
{
Sesion.Delete(entidad);
}
............. etc
tengo otra clase que la llamé BaseNegocio<T> (donde T es la entidad de
negocio) que contiene un campo de tipo IRepositorio que es cargado en
el load con windsor. Contiene casi las mismas operaciones que el
repositorio pero con la diferencia q esta se encarga de realizar
validaciones sobre las entidades antes de realizar la operacion, y
otras cosas mas. La cosa es que tengo toda una capa de negocios que
heredan de esta clase base, todo funciona bien mientras grabo una sola
entidad, el problema ocurre cuando trato de grabar 2 o mas clases, de
esta forma:
public void GrabarNuevaPersona()
{
PersonaNegocio lnPersona = new PersonaNegocio(); // Hereda de
BaseNegocio
LogNegocio lnLog = new LogNegocio(); // Herda de BaseNegocio
lnPersona.Insertar(persona);
lnLog.Insertar(log);
}
Graba las 2 entidades bien, pero si digamos ocurre un problema con
log, no hace un rollback de la transacción. Cómo puedo resolver mi
problema? sé que estoy haciendo algo mal pero realmente no puedo
detectar donde.
Help please and thanks in advance for any advice/help.
Ariel
I tried to use a transation like this:
public void GrabarNuevaPersona()
{
PersonaNegocio lnPersona = new PersonaNegocio();
LogNegocio lnLog = new LogNegocio();
using(var transaction = Sesion.BeginTransaction())
{
lnPersona.Insertar(persona);
lnLog.Insertar(log);
}
}
But the transaction is closed after Insertar(persona).
Well I think the only solution is change de "decoration" to each
Service instead of the repository and decorate this method with
EndMode.End. Or is there another way to do it?
Thanks for the help