Как загрузить корневой объект и его дочерние объекты на основе IsDeleted = true, используя EntityFramework - PullRequest
1 голос
/ 24 января 2012

Я должен реализовать мягкое удаление, используя рамочные права.

  • В моих таблицах БД есть столбец битов IsDeleted.
  • Соответствующие объекты также имеют поле IsDeleted.
  • Когда пользователь удаляет дочернюю сущность, IsDeleted в значении Set для true для этого дочернего объекта и сохраняется хорошо.
  • При загрузке графа сущность-объект я хочу убедиться, что все соответствующие сущности загружены с условием IsDeleted = false.
  • Попытка использования справки по следующей ссылке, но я получаю много ошибок: обработка-логическое-удаление-с-сущностью-framework-4 .

Вот ошибка, которую я получаю для каждой сущности:

ошибка 3032: проблема в отображении фрагментов, начинающихся со строки 38: сопоставляется элемент условия с условием, отличным от «IsNull = False». Либо удалите условие для EntityHavingClause.IsDeleted, либо удалите его из сопоставления.

В: Может кто-нибудь сказать, где я ошибаюсь и какой самый простой способ загрузить все права ребенка, чьи IsDelete = false?

Ответы [ 2 ]

1 голос
/ 24 января 2012

Вы сопоставили EntityHavingClause.IsDeleted как свойство и как условие.Вы не можете делать и то и другое.

Когда вы следуете приведенному выше примеру, вам не нужно отображать свойство.

Редактировать:

По мере того как вынужно, как свойство, так и условие, вероятно, лучший способ - добавить вычисляемый столбец в таблицу базы данных, в котором просто отображается значение IsDeleted (если вы можете изменить схему, то есть).Затем сопоставьте условие с вычисленным столбцом.

Я думаю, что это проще, чем пытаться взломать EF, чтобы отобразить один и тот же столбец дважды (если это вообще возможно).

0 голосов
/ 24 января 2012

Это не так просто.Как указал @GertArnold, вы не можете сопоставить colum, если хотите использовать его в условии, и в то же время ленивая и энергичная загрузка не будет использовать ваше условие, если оно не отображается.Каждый столбец может быть отображен только один раз, и условие отображается.

Хитрость в том, что если вы хотите мягкого удаления, вы не можете ожидать, что ваша бизнес-логика справится с этим.Это станет обязанностью EF.Вам потребуется сопоставленная хранимая процедура для удаления операции вашей сущности, которая установит поле IsDeleted вместо реального удаления.Можно отобразить команду SQL напрямую, без использования хранимой процедуры, но это не поддерживается в конструкторе - вам придется вручную поддерживать файл EDMX в формате XML.

Ваша модель не будет поддерживать реальное удаление объекта, и при использовании этой модели у вас никогда не будет доступа к программно удаленным объектам.Вот как работает мягкое удаление с платформой сущностей.Если вам нужно реальное удаление или доступ к объектам с мягким удалением, вам понадобится другая модель (еще один EDMX), в котором объект будет снова отображен без мягкого удаления, или вам придется использовать какой-то прием для обмана первого EDMX и сопоставления объекта снова (представление базы данных)или, возможно, псевдоним таблицы).

...