Как загрузить корневой объект и его дочерние объекты на основе IsDeleted = true, используя EntityFramework
Я должен реализовать мягкое удаление, используя рамочные права.
- В моих таблицах БД есть столбец битов
IsDeleted
, - Соответствующие организации также имеют
IsDeleted
поле. - Когда пользователь удаляет дочернюю сущность,
IsDeleted
в значение true для этого дочернего объекта и сохраняется хорошо. - При загрузке графа сущность-объект я хочу убедиться, что все соответствующие сущности загружены с условием
IsDeleted
= ложь - Он попытался использовать справку по следующей ссылке, но я получаю много ошибок: обработка-логическое-удаление-с-сущностью-framework-4.
Вот ошибка, которую я получаю для каждой сущности:
ошибка 3032: проблема в отображении фрагментов, начинающихся со строки 38: сопоставляется элемент условия с условием, отличным от "IsNull=False". Либо удалите условие для EntityHavingClause.IsDeleted, либо удалите его из сопоставления.
В: Может ли кто-нибудь сказать, где я иду не так и каков был бы самый простой способ загрузить все права ребенка, чьи IsDelete
= ложь?
2 ответа
Вы картировали EntityHavingClause.IsDeleted
как собственность и как условие. Вы не можете сделать оба.
Когда вы следуете примеру, на который ссылаетесь, вам не нужно отображать свойства.
Редактировать:
Поскольку вам нужно и свойство, и условие, вероятно, лучший способ - добавить вычисляемый столбец в таблицу базы данных, который просто отображает значение IsDeleted (если вы можете изменить схему, то есть). Затем сопоставьте условие с вычисленным столбцом.
Я думаю, что это проще, чем пытаться взломать EF, чтобы отобразить один и тот же столбец дважды (если это вообще возможно).
Это не так просто. Как указал @GertArnold, у вас не может быть сопоставления colum, если вы хотите использовать его по условию, и в то же время ленивая и энергичная загрузка не будет использовать ваше условие, если оно не сопоставлено. Каждый столбец может быть отображен только один раз, и условие отображается.
Хитрость в том, что если вы хотите мягкого удаления, вы не можете ожидать, что ваша бизнес-логика справится с этим. Это станет обязанностью EF. Вам понадобится хранимая процедура, отображенная для удаления операции вашей сущности, которая установит IsDeleted
поле вместо выполнения реального удаления. Можно отобразить команду SQL напрямую, не используя хранимую процедуру, но это не поддерживается в конструкторе - вам придется вручную поддерживать файл EDMX в формате XML.
Ваша модель не будет поддерживать реальное удаление объекта, и при использовании этой модели у вас никогда не будет доступа к программно удаленным объектам. Вот как работает мягкое удаление с платформой сущностей. Если вам нужно реальное удаление или доступ к программно удаленным объектам, вам понадобится другая модель (еще один EDMX), в котором объект будет снова отображаться без мягкого удаления, или вам придется использовать какой-то прием для проверки первого EDMX и сопоставления объекта снова (представление базы данных). или, возможно, псевдоним таблицы).