DefaultDeleteEventListener と DefaultLoadEventListener をオーバーライドすると、Nhibernate を使用してソフト削除可能オブジェクトを実装するための非常に優れたソリューションが提供されました。
public class SoftDeletableLoadEventListener : DefaultLoadEventListener
{
#region Non-public members
protected override object DoLoad(LoadEvent @event,
IEntityPersister persister, EntityKey keyToLoad,
LoadType options)
{
object entity = base.DoLoad(@event, persister, keyToLoad, options);
var softEntity = entity as ISoftDeletable;
if (softEntity != null && softEntity.IsDeleted)
{
if (options == LoadEventListener.ImmediateLoad
|| options == LoadEventListener.Load)
{
string msg =
string.Format("Can not Load soft deleted entity typeof({0}) with Id {1} as it was deleted.",
softEntity.GetType().Name,
softEntity.Id);
throw new InvalidOperationException(msg);
}
}
return entity;
}
#endregion
}
DefaultLoadEventListener の要約として次のように述べています。
これは、ExtraLazyLoading を実行するときにフィルターが適用されないことを意味します。その結果、たとえば、削除されたエンティティがカウントされます。クエリ中にソフト削除可能フィルターを適用する別の方法はありますか? 常に手動で制限を追加してフィルタリングするよりも良い方法はありますか?