Ho un utente con un numero di ruoli. L'utente è collegato ai ruoli utilizzando una tabella di entità di collegamento. Ho impostato il file di configurazione per eliminare in cascata le entità di collegamento dei ruoli utente quando un utente viene eliminato.Perché Session.Evict in OnPostUpdate causa l'eccezione "Possibile accesso non protetto alla sessione"?
Attualmente stiamo utilizzando la cancellazione per eliminare entità. Abbiamo aggiunto un listener di eventi di eliminazione soft attivato da un'eliminazione. Quando un'entità viene eliminata, attiva l'evento DeleteEntity
che contrassegna l'entità come eliminata.
Abbiamo anche annullato l'evento OnPostUpdate
per rimuovere le entità dalla cache chiamando Evict sull'entità.
Se creo un utente senza ruoli, quindi cancellarlo, tutto funziona correttamente (funziona anche se la cascata è disabilitata). Tuttavia se ho un utente con almeno un ruolo assegnato e cancello l'utente, dopo la chiamata a Evict in OnPostUpdate
, ottengo un'eccezione NHibernate "NHibernate.AssertionFailure: Possibile accesso nonthread safe alla sessione".
Ho provato, in OnPostUpdate
, a utilizzare la sessione secondaria per eliminare l'entità, l'eccezione non viene generata, tuttavia, l'entità non viene eliminata.
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);
}
}
Qualche idea su come risolverlo?
grazie mille! – KeatsPeeks