2016-12-28 3 views
0

Вместо того, чтобы удалять запись из базы данных, я планирую использовать логический столбец, такой как isActive в каждой таблице, и управлять его состоянием true/false.Поддержание ссылочной целостности без фактического удаления записи

Обычно при удалении записи из базы данных,

  1. ссылочную целостность сохраняется, а значит, вы не можете удалить его, если перед удалением его зависимостей.
  2. при запросе удаленной записи, он возвращает нуль

Как можно достичь тех же результатов в автоматизированном режиме с использованием Entity Framework? Поскольку проверка поля isActive для каждого объекта в каждом запросе вручную кажется слишком большой работой, которая будет подвержена ошибкам. То же самое справедливо и для маркировки зависимостей как isActive=false.

EDIT:

Моя цель не ограничивается точка-в-времени запросов. Позвольте мне привести пример. UserA опубликовал фотографию, и UserB написал комментарий к ней. Затем UserB хотел удалить свою учетную запись. Но в комментарии есть свой плакат FK, указывающий на UserB. Поэтому, вместо того, чтобы удалять UserB, я хочу деактивировать его учетную запись, но сохраните запись, чтобы не нарушать зависимости. И я хочу расширить эту логику до каждой таблицы в базе данных. Это неправильно?

+0

Таким образом, вы хотите избежать проверки нуля, чтобы вместо этого проверить свойство записи, чтобы убедиться, что она активна, что удовлетворяет нулевой проверке, потому что вам не нравится ссылочная целостность? –

+0

Если вы планируете использовать булевский столбец, вам следует планировать его проверку. –

+0

@DarkBobG Нет, я не хочу физически удалять записи из базы данных, просто удаляйте их. Но в то же время принудительно применяйте какую-либо ссылочную целостность в отношении этого статуса удаления. Это должно быть сделано в приложении, но мне интересно, может ли быть автоматическое решение. –

ответ

0

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

Это ошибок. Но вы не всегда можете использовать только активные записи (страница администратора?). Вы также можете не хотеть мягко удалять ВСЕ записи, поскольку не все имеет смысл обойти (по моему опыту). Вы можете использовать Expression, чтобы помочь вам/подключить его к определенным методам/репозиториям и построить динамические запросы.

Expression<Func<MyModel, bool>> IsActive = x => x.IsActive; 

И то же самое справедливо и для маркировки зависимостей, как IsActive = ложь

Базовый репозиторий может обрабатывать удаление для всех хранилищ, которые должны установить статус ЛОЖЬ (где BaseModel будет иметь свойство IsActive).

 public int Delete<TEntity>(long id) where TEntity : BaseModel 
     { 
      using (var context = GetContext()) 
      { 
       var dbEntity = context.Set<TEntity>().Find(id); 
       dbEntity.IsActive = false; 
       return context.SaveChanges(); 
      } 
     } 
0

Существует инструмент OSS называется EF фильтры, которые могут добиться того, что вы ищете: https://github.com/jbogard/EntityFramework.Filters

Это давайте установить глобальные фильтры как IsActive поле и, конечно, работать для запросов.

1

Как побочный ответ на этот вопрос, вместо того, чтобы напрямую запрашивать все таблицы, почему бы не использовать Views, а затем запросить представления? Вы можете поместить фильтр в представление, чтобы отображать только записи «IsActive = true», поэтому вам не нужно беспокоиться о том, чтобы включать его вручную в каждый запрос (что-то, о чем вы упоминаете, подвержено ошибкам).

Смежные вопросы