いくつかの役割を持つユーザーがいます。ユーザーは、リンクエンティティテーブルを使用してロールにリンクされます。ユーザーが削除されたときにユーザーロールリンクエンティティをカスケード削除するように構成ファイルを設定しました。
現在、ソフト削除を使用してエンティティを削除しています。削除によってトリガーされるソフト削除イベントリスナーを追加しました。DeleteEntity
エンティティが削除されると、エンティティを削除済みとしてマークするイベントがトリガーされます。
OnPostUpdate
エンティティでEvictを呼び出すことにより、キャッシュからエンティティを削除するイベントをオーバーライドすることもできます。
ロールのないユーザーを作成してから削除すると、すべてが正常に機能します(カスケードが無効になっている場合も機能します)。ただし、少なくとも1つのロールが割り当てられているユーザーがいて、そのユーザーを削除すると、でEvictを呼び出した後、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);
}
}
それを解決する方法について何かアイデアはありますか?