2015-12-18 7 views
1

Я хотел бы реализовать функцию мягкого удаления в приложении, использующем E.F.6 с использованием метода first (.edmx). Следующие советы и рекомендации по ссылкам: link1 и link2 мне удалось сделать следующее:E.F.6, DB сначала, мягкое удаление - условие сопоставления вычисленного столбца

  • Добавлена ​​колонка IsDeleted на столе
  • Добавлено вычисляемый столбец IsDeletedMapping на столе, который имеет такое же значение, как IsDeleted
  • Добавлен интерфейс ISoftDelete, который будет реализован на объектах таблицы

Затем я добавил код для обработки Удалить действие для объектов в методе SqlRepository Delete.

// if has ISoftDelete interface perform soft delete. 
if (typeof (ISoftDelete).IsAssignableFrom(typeof (T))) 
{ 
    entry.State = EntityState.Modified; 
    var tempEntry = entry.Entity as ISoftDelete; 
    tempEntry.IsDeleted = true; 
} 
// else, mark entity state as Deleted 
else 
{ 
    entry.State = EntityState.Deleted; 
} 

Это означает, что объекты, которые реализуют интерфейс ISoftDelete будет вместо быть удален в БД, просто обновляется с IsDeleted = True. Также значение IsDeletedMapping будет установлено в true, поскольку оно вычисляется из IsDeleted.

Проблема, с которой я столкнулся, заключается в том, как фильтровать IsDeleted = false в запросах EF.

То, что я пробовал, - это отображение условий на IsDeletedMapping, так как это означает, что EF будет автоматически фильтровать это для нас.

Condition mapping of IsDeletedMapping

Но здесь кроется проблема. IsDeletedMapping имеет StoreGeneratedPattern свойство установлено в Вычисляется и поэтому я получаю сообщение об ошибке:

Error 2016: Condition cannot be specified for Column member 'IsDeletedMapping' because it is marked with a 'Computed' or 'Identity' StoreGeneratedPattern.

Таким образом, вопрос: Есть ли обходной путь, чтобы установить условие отображение на вычисляемый столбец? Также, если у вас есть лучший подход к реализации мягкого удаления, я буду более счастлив попробовать его. Имейте в виду, что реализация должна автоматически фильтровать мягкие удаленные записи.

Спасибо за ваши ответы!

+1

Я бы настоятельно рекомендовал вывести эту логику из сущностей, которые вы привязаны к БД, и сохранить их в своем DAO-слое - переопределить репозиторий. Удалить работу или что-то в этом роде. Мессинг с вычисленными свойствами в EF довольно рискован и неосуществлен из моего опыта –

ответ

0

Я думаю, что ваша реализация слишком сложна. Вот что мы сделали:

  1. Добавить IsDeleted (BOOL, не нулевой) столбец таблиц
  2. Карта Удалить функцию объекта хранимой процедуры, которая фактически устанавливает IsDeleted = 0, вместо реального удаления. Это заставит вас также отображать функции «Вставка» и «Обновить», но мы все равно предпочитали процедуры.
  3. Фильтр примитива IsDeleted = 0 в EDMX

Теперь все ваши объекты автоматически фильтруется IsDeleted = 0, и ваш метод удаления в хранилище может сделать реальное удаление, скрывая тот факт, что записи на самом деле не удалены из базы данных. Поэтому, если вы когда-либо захотите делать реальные удаления или, возможно, выполняете soft-delete только на некоторых сущностях, ваш код не будет знать об этом.

Не забывайте, что после того, как поле таблицы является фильтром сущности, оно не может быть сопоставлено с сущностью. У вашего кода не будет свойства IsDeleted в классе сущности.