Проблема с отложенной загрузкой мягко удаленных объектов с помощью Nhibernate

Привет всем, у меня есть проблема, которую я постараюсь кратко описать В нашем приложении мы используем Nhibernate как ORM и Fluent Nhibernate для сопоставления, и было реализовано мягкое удаление для сущностей, которые означают, что сущность не удаляется физически для базы данных, это просто задайте для свойства DeletedBy и DeletedDate значения. И проблема в том, что когда объекты загружаются с отложенной загрузкой, загружаются также и мягко удаленные объекты. После загрузки сущностей мне нужно отфильтровать, где DeletedDate имеет значение NULL в каждом месте кода, где вызываются эти сущности, но это нехорошо.

Как в целом решить для всех сущностей эту проблему с мягким удалением ленивой загрузки?

Можешь мне помочь?

Заранее спасибо!


person Serghei    schedule 01.08.2011    source источник


Ответы (2)


Я не использовал Fluent-Hibernate, поэтому не уверен, сработает ли он для вас, но для классического NHibernate:

В файле сопоставления классов HBM поместите предложение where в:

<class  name="Class_Type" table="Entity_Table" where="DeletedBy is null" >
...
</class>

возвращать только те объекты, которые не были логически удалены для каждого запроса

person Tom Carter    schedule 01.08.2011
comment
как я понял, мне нужно добавить предложение Where для объекта, который я хочу использовать при ленивой загрузке или как? - person Serghei; 01.08.2011
comment
NHibernate должен автоматически применять предложение where во всех случаях. - person Tom Carter; 01.08.2011

С помощью беглой карты Nhibernate проблема решается следующим образом: в сопоставлении классов для карты дочерней коллекции необходимо добавить следующий оператор

.Where("DeletedDate is null")

пример

 HasMany(x => x.Registrations).Where("DeletedDate is null").KeyColumn("qualificationEnrolmentId").Inverse().Cascade.AllDeleteOrphan();

методы, где есть переопределение с выражением LINQ, но это не работает в этом случае

Where(x=>x.DeletedDate == null)

этот код не работает, потому что x в лямбда-выражении распознается как родительский объект и другое переопределение для метода Where accept в параметре SQL-запроса, а не HQL.

person Serghei    schedule 01.08.2011