Мягкое удаление с использованием быстрой гибернации и сверх ленивой загрузки

Переопределение 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 указано: Определяет прослушиватели событий загрузки по умолчанию, используемые NHibernate для загрузки сущностей в ответ на сгенерированные события загрузки.

Это означает, что при выполнении ExtraLazyLoading фильтр не применяется, что приводит, например, к подсчету удаленных объектов. Есть ли другой способ применить мягкие удаляемые фильтры во время запросов? Есть ли лучшие способы, чем всегда фильтровать добавление ограничений вручную?


person Yurii Hohan    schedule 07.01.2013    source источник


Ответы (1)


Я реализовал мягкое удаление с помощью nh без переопределения DefaultLoadEventListener, но я думаю, что моя стратегия загрузки коллекции также может вам помочь. Вы можете добавить в свои коллекции спецификацию предложения where:

Свободное владение NHibernate

.Override<Parent>(map =>
{
    map.HasMany<Child>(p => p.Children)
        .Where("IsDeleted = 0");
})

HBM.xml

<bag name="Children" where="IsDeleted = 0">
  <key>
    <column name="ParentID" />
  </key>
  <one-to-many class="Child" />
</bag>

изменить Только что нашел эту ссылку о мягких удалениях из nhibernate.info, который рекомендует использовать переопределенный DefaultLoadEventListener и фильтровать выборки с использованием спецификации предложения where.

person Joe Carr    schedule 10.01.2013
comment
Спасибо, это хороший момент, но я бы хотел найти более общее решение. - person Yurii Hohan; 11.01.2013
comment
Говоря более общим языком, я предполагаю, что вы хотите сделать модификацию в одном месте, а не обозначать каждую из ваших коллекций спецификацией предложения where? - person Joe Carr; 11.01.2013
comment
Да, это был бы самый изящный способ. Я думаю, что наличие соглашения о коде, чтобы всегда добавлять предложение Where () для сопоставления коллекций, немного громоздко. - person Yurii Hohan; 11.01.2013
comment
Другой недостаток в том, что если кто-то покидает реализацию SoftDeletableLoadEventListener сверху, у него есть два там же предложения, указывающих то же самое. Если удалить SoftDeletableLoadEventListener, тогда все методы репо должны содержать условия IsDeleted там, где это необходимо. Даже проблематично, если можно мягко удалить весь домен - person Yurii Hohan; 11.01.2013