我有一个具有多个角色的用户。用户使用链接实体表链接到角色。我已将配置文件设置为在删除用户时级联删除用户角色链接实体。
我们目前正在使用软删除来删除实体。我们添加了一个由删除触发的软删除事件侦听器。当一个实体被删除时,它会触发将该DeleteEntity
实体标记为已删除的事件。
我们还通过OnPostUpdate
在实体上调用 Evict 来覆盖事件以从缓存中删除实体。
如果我创建一个没有任何角色的用户,然后将其删除,一切正常(如果级联禁用它也可以)。但是,如果我有一个分配了至少一个角色的用户并且我删除了该用户,那么在调用 Evict in 之后OnPostUpdate
,我会收到一个 NHibernate 异常“NHibernate.AssertionFailure:可能的非线程安全访问会话”。
我已经尝试在OnPostUpdate
中使用子会话来驱逐实体,但不会引发异常,但是实体不会被驱逐。
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);
}
}
关于如何解决它的任何想法?