Overriding DefaultDeleteEventListener and DefaultLoadEventListener provided a really good solution to implement soft deletables using 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
}
As the summary for DefaultLoadEventListener states: Defines the default load event listeners used by NHibernate for loading entities in response to generated load events.
This means that when doing ExtraLazyLoading the filter is not applied which results in e.g.: Deleted entities being count. Is there another way to apply soft deletable filters during queries? Are there better ways then always filtering adding restriction manually?