2016-12-28 53 views
0

我打算在每个表中使用像isActive这样的布尔列并管理它的true/false状态,而不是从数据库中删除条目。在不实际删除记录的情况下保持参照完整性

通常,当你从数据库中删除一条记录,

  1. 引用完整性得以保持,这意味着如果要删除其依赖关系之前,你不能删除它。
  2. 当您查询已删除的记录,则返回null

我如何能实现使用实体框架自动的方式相同的结果?因为手动检查每个查询中的每个实体的isActive字段看起来工作量太大,容易出错。对于将相关性标记为isActive=false也是如此。

编辑:

我的目的并不局限于点即时查询。让我举个例子。 UserA发布了一张照片,UserB对此发表了评论。然后UserB想要删除他的帐户。但评论有它的海报FK指向UserB。因此,我不想删除UserB,而是要停用其帐户,但保留该记录以便不中断依赖关系。 我想将此逻辑扩展到数据库中的每个表。那是错的吗?

+0

因此,你想避免空检查,而不是检查记录的属性,看它是否是活动的,这是空检查满足,因为你不喜欢参照完整性? –

+0

如果您打算使用布尔列,那么您应该计划检查它。 –

+0

@DarkBobG不,我不想从数据库中删除记录,只是将它们标记为已删除。但同时对这种删除状态强制执行某种参照完整性。它必须在应用程序中完成,但我想知道是否可以有自动化解决方案。 –

回答

0

因为检查isActive域对于每个查询每个实体手动似乎太辛苦了,这将是容易出错

这很容易出错。但是你可能并不总是只需要活动记录(管理页面?)。你也可能不想软删除所有记录,因为不是所有的东西都有意义(以我的经验)。您可以使用表达式来帮助您将某些方法/存储库连接起来并构建动态查询。

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

而对于标示的依赖关系为isActive =假

一个基础库可以处理该删除所有的资料库,这将状态设置为false也是如此(其中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(); 
      } 
     } 
1

作为这个问题的一个答案,而不是直接查询所有的表,为什么不使用视图,然后查询视图?你可以在视图中放置一个过滤器,只显示“IsActive = true”记录,这样你就不用担心在每个查询中手动包含它(你提到的东西很容易出错)。

相关问题