Tengo un usuario que tiene varios roles. El usuario está vinculado a los roles usando una tabla de entidades de enlace. He configurado el archivo de configuración para que elimine en cascada las entidades de enlace de funciones de usuario cuando se elimina un usuario.¿Por qué Session.Evict en OnPostUpdate causa la excepción de "Posible acceso sin acceso a la sesión"?
Actualmente estamos utilizando la eliminación de software para eliminar entidades. Hemos agregado un detector de eventos de eliminación suave que se activa mediante una eliminación. Cuando se elimina una entidad, desencadena el evento DeleteEntity
que marca la entidad como eliminada.
También tenemos que anular el evento OnPostUpdate
para eliminar las entidades del caché llamando a Desalojar en la entidad.
Si creo un usuario sin ningún rol, lo elimino, todo funciona bien (también funciona si la cascada está deshabilitada). Sin embargo, si tengo un usuario con al menos un rol asignado y borro al usuario, después de la llamada a Desalojar en OnPostUpdate
, aparece una excepción de NHibernate "NHibernate.AssertionFailure: Posible acceso a la sesión que no es de seguridad".
He intentado, en OnPostUpdate
, usar la sesión secundaria para Desalojar a la entidad, la excepción no se produce, sin embargo, la entidad no se desaloja.
public void UserDelete(.....)
{
var user = repository.Fetch<User>(id);
repository.Remove(user);
repository.Connection.Commit();
}
// soft delete event listener
protected override void DeleteEntity(NHibernate.Event.IEventSource session, object entity, ..)
{
var repositoryEntity = entity as deletableentity;
if (repositoryEntity != null)
{
if (!repositoryEntity.IsDeleted)
{
// this marks the entity as deleted
repositoryEntity.isDeleted = true;
// cascade delete
this.CascadeBeforeDelete(session, persister, repositoryEntity, entityEntry, transientEntities);
this.CascadeAfterDelete(session, persister, repositoryEntity, transientEntities);
}
}
}
public void OnPostUpdate(PostUpdateEvent @event)
{
if (@event == null) throw new ArgumentNullException("event");
var entity = @event.Entity as deletableentity;
// Evict any entities that have been set as deleted from first level cache.
if (entity != null && entity.IsDeleted)
{
@event.Session.Evict(entity);
}
}
¿Tienes alguna idea de cómo resolverlo?
muchas gracias! – KeatsPeeks