Mam użytkownika, który ma wiele ról. Użytkownik jest połączony z rolami za pomocą tabeli encji łączenia. Ustawiłem plik konfiguracyjny, aby kaskadowo usuwał elementy encji roli użytkownika, gdy użytkownik jest usuwany.Dlaczego funkcja Session.Evict w pliku OnPostUpdate powoduje wyjątek "Możliwy brak dostępu do sesji"?
W tej chwili używamy miękkiego usunięcia do usunięcia encji. Dodaliśmy detektor zdarzeń usuwania miękkiego, który jest wyzwalany przez usunięcie. Gdy obiekt jest usuwany, wyzwala zdarzenie DeleteEntity
, które oznacza usuniętą jednostkę.
Mamy również zastąpić zdarzenie OnPostUpdate
, aby usunąć elementy z pamięci podręcznej, wywołując Evict na encji.
Jeśli utworzę użytkownika bez żadnych ról, usuń go, wszystko działa poprawnie (działa również po wyłączeniu kaskady). Jednak jeśli mam użytkownika z co najmniej jedną rolą przypisaną i usuwam użytkownika, po wywołaniu Evict w OnPostUpdate
, otrzymuję wyjątek NHibernate "NHibernate.AssertionFailure: Possible nonthreadsafe access to session".
Próbowałem, w OnPostUpdate
, użyć sesji potomnej do eksmisji podmiotu, wyjątek nie jest wyrzucany, jednak jednostka nie jest eksmitowana.
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);
}
}
Wszelkie pomysły na rozwiązanie problemu?
dziękuję bardzo! – KeatsPeeks