问题标签 [soft-delete]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
6815 浏览

c# - 在将所有导航属性加载(惰性或急切)到内存之前过滤所有导航属性

对于未来的访问者:对于 EF6,您可能最好使用过滤器,例如通过这个项目:https ://github.com/jbogard/EntityFramework.Filters

在我们正在构建的应用程序中,我们应用“软删除”模式,其中每个类都有一个“已删除”布尔值。在实践中,每个类都简单地继承自这个基类:

举一个简单的例子,假设我有类GymMemberWorkout

当我从数据库中获取健身房成员列表时,我可以确保没有获取任何“已删除”的健身房成员,如下所示:

然而,当我遍历这些健身房成员时,他们Workouts是从数据库中加载的,而不考虑他们的Deleted标志。虽然我不能责怪 Entity Framework 没有注意到这一点,但我想以某种方式配置或拦截延迟属性加载,以便永远不会加载已删除的导航属性。

我一直在考虑我的选择,但它们似乎很少:

这根本不是一种选择,因为这将是太多的手动工作。(我们的应用程序很大,而且每天都在变大)。我们也不想放弃使用 Code First 的优势(其中有很多)

再次,不是一个选择。此配置仅适用于每个实体。总是急切地加载实体也会造成严重的性能损失。

  • 应用表达式访问者模式,该模式会自动注入.Where(e => !e.Deleted)它找到的任何地方IQueryable<Entity>,如此此处所述。

我实际上在概念验证应用程序中对此进行了测试,并且效果非常好。这是一个非常有趣的选项,但是很遗憾,它无法将过滤应用于延迟加载的导航属性。这很明显,因为那些惰性属性不会出现在表达式/查询中,因此无法替换。我想知道 Entity Framework 是否允许在他们的DynamicProxy类中的某处加载惰性属性的注入点。我也担心其他后果,例如破坏IncludeEF 机制的可能性。

  • 编写实现 ICollection 但Deleted自动过滤实体的自定义类。

这实际上是我的第一个方法。这个想法是为每个内部使用自定义 Collection 类的集合属性使用一个支持属性:

虽然这种方法实际上还不错,但我仍然有一些问题:

  • 它仍然将所有Workouts 加载到内存中,并Deleted在属性设置器被命中时过滤那些。以我的拙见,这为时已晚。

  • 执行的查询与加载的数据之间存在逻辑不匹配。

想象一个场景,我想要一个自上周以来进行锻炼的健身房成员的列表:

此查询可能会返回一个健身房成员,该成员仅具有已删除但也满足谓词的锻炼。一旦它们被加载到内存中,就好像这个健身房成员根本没有锻炼!您可以说开发人员应该意识到Deleted并始终将其包含在他的查询中,但这是我真正想避免的事情。也许 ExpressionVisitor 可以在这里再次提供答案。

  • Deleted在使用 CustomCollection 时,实际上不可能将导航属性标记为。

想象一下这个场景:

你会期望Workout在数据库中更新相应的记录,你就错了!由于gymMember酒店正在检查ChangeTracker是否有任何变化,酒店gymMember.Workouts将突然减少 1 次锻炼。那是因为 CustomCollection 会自动过滤已删除的实例,记得吗?所以现在Entity Framework认为需要删除锻炼,EF会尝试将FK设置为​​null,或者实际删除记录。(取决于您的数据库的配置方式)。这就是我们一开始就试图避免的软删除模式!!!

我偶然发现了一篇有趣的博客文章,它覆盖了默认SaveChanges方法,DbContext因此任何带有 an 的条目EntityState.Deleted都被改回,EntityState.Modified但这再次让人感觉“hacky”而且相当不安全。但是,如果它解决了没有任何意外副作用的问题,我愿意尝试一下。


所以我在这里是 StackOverflow。如果我自己可以这么说的话,我已经非常广泛地研究了我的选择,而且我已经束手无策了。所以现在我转向你。您是如何在企业应用程序中实现软删除的?

重申一下,这些是我正在寻找的要求:

  • 查询应自动排除Deleted数据库级别的实体
  • 删除实体并调用“SaveChanges”应该只是更新相应的记录并且没有其他副作用。
  • 加载导航属性时,无论是惰性还是急切,Deleted都应自动排除这些属性。

我期待着任何和所有的建议,提前谢谢你。

0 投票
1 回答
1054 浏览

c# - DataGridView中如何实现软删除

我有一个绑定到对象数据源的 DataGridView。该对象具有属性“IsDeleted”。当用户按下删除键,或单击删除按钮,或以其他方式删除一行时,我想设置“IsDeleted”标志而不是删除该行。(然后我希望 datagridview 更新)。

我需要实现这种行为的单点联系是什么?

我不想尝试单独处理所有用户路径。

0 投票
0 回答
190 浏览

sql - 级联软删除的原因

在关系数据库中,使用软删除似乎很常见。我的思考是是否真的有必要级联这些删除?我想知道的原因是,在我看来,级联软删除不会添加任何额外信息。

即假设我们有一个表 MainContract 和一个表 ServiceContract,其中关系是一对多的。假设我们软删除 MainContract 但忽略这样做,让我们说三个都属于这个 MainContract 的 ServiceContract。

如果我们在数据库中查询未删除的 ServiceContract,我们可以轻松检查拥有该 ServiceContract 的 MainContract 是否已删除。

光是构思,就让我意识到,这里的设计选择,或许取决于它是否更可能被我们经常删除,或者我们是否需要在历史记录中大量浏览。

如果我们经常删除但不需要经常检查历史记录,最好有一种简单的删除方法(而不是级联软删除)。另一方面,如果我们需要经常检索历史记录,那么实现级联删除可能是值得的,这样我们就需要不太复杂的查询。

但是,在关系数据库中,行本身通常没有意义。所以在任何情况下,我们都需要在“树上”进行连接,以使一行有意义。例如,一个 ServiceContract 在不知道它属于哪个 MainContract 的情况下可能不会提供任何有意义的信息。

有人对此有任何想法吗?有没有人使用过这些方法中的任何一种或两种?

0 投票
3 回答
7465 浏览

symfony - Symfony2 / Doctrine:使用 Gedmo 的学说扩展时读取“已删除”数据

我正在构建一个 Symfony2 项目并使用gedmo/doctrine-extensionsGitHub)来实现软删除。我的问题是是否有办法“禁用”或“覆盖”软删除,甚至检测是否有某些内容被软删除。

情况如下:

我有一个引用“用户”实体的“注释”实体。特定注释引用了已软删除的用户。即使用户已被删除,它也会为 TWIG 的“已定义”逻辑返回 true,甚至可以返回已删除用户的 id。但是,如果我查询任何其他信息(包括标记是否已被删除的“deletedAt”参数),我会收到 500“找不到实体”错误。

由于数据实际上仍然存在,并且由于笔记本身没有被删除,所以我仍然想说谁写了笔记,即使用户已被删除。

那可能吗?如果没有,我如何正确检测是否有内容被软删除?就像我说的,$note->getUser()仍然检索一个对象并为任何 null /“已定义”比较返回 true。

0 投票
1 回答
1228 浏览

php - SoftDelete、关系和 SonataORMAdminBundle

我使用 SonataAdminBundle - 更具体地说是带有 Doctrine 的 SonataORMAdminBundle - 来做我的一些管理工作。到目前为止,这被证明是一个非常有用的 Bundle,但是,合理地删除实体有点棘手。

考虑一个 Tour 实体有一个 Truck 和一个 Trailer 实体,但是当 Truck 被丢弃时,它不应再出现在整个 Admin Application 中。尽管如此,可能仍然存在与这辆卡车有关的遗留旅游实体。

因此,当用户可能在管理员中编辑这样的旧版 Tour 时,不清楚如何解决这个问题,实体选择是否消失了?

我已经查看了 SoftDelete Extension Bundles,但它似乎需要做很多工作来调整所有特定情况。

Bundle Level 或 Doctrine in General 是否有一种简单的方法来解决这类问题?

0 投票
1 回答
281 浏览

python - Django中的每个用户软删除模型设计

我正在设计一个用户发送/接收记录的应用程序,我希望为记录中列出的每个用户分开删除(一个用户的删除不会对另一个用户隐藏记录)。

我的基本模型设计如下所示:

archived_by_xxxx将字段替换ManyToManyFieldaccounts.CommonUserProfile负责存储隐藏(软删除)记录的用户列表的字段是否会有所改进?似乎这会使客户端代码更简单。通常如何在每个用户的基础上实施软删除?

0 投票
1 回答
1323 浏览

neo4j - Neo4j:使用可选关系实现软删除

我正在尝试在 Neo4j 中实现软删除。从 Alice 的角度来看,Cypher 中描述的图形是这样的:

而不是实际删除一个节点及其关系,我

  1. 更改其标签,使其不再可以直接查找,即删除其User标签并添加_User标签(注意下划线)
  2. 替换它的关系,这样我的正常查询就不能再访问它了,例如删除它的:FOLLOWS关系并用关系替换它:_FOLLOWS

所以这基本上相当于将一行移动到关系数据库中的归档表中。我认为这是一种非常有效的方法,因为您实际上永远不会访问已软删除的图表部分。此外,您不必修改任何现有查询。

软删除 Alice 的结果应该是这样的:

我对查询的第一次尝试是这样的:

问题是当这个用户没有关注任何人时,查询会尝试在和之间创建关系usernull因为第二个匹配是可选的,所以它给了我这个错误:Other node is null.

我的第二次尝试是这样的:

因此,我将关系和主题放入地图中,将这些地图收集到一个集合中,将每个“空”地图扔掉并循环访问该集合。但是这个查询给了我这个错误:

有谁知道我该如何解决这个问题?

谢谢,扬

0 投票
1 回答
789 浏览

sql-server - 软删除的存储过程

此代码用于执行软删除。它首先删除一条记录。如果删除成功,则回滚并更新同一记录的标志列。如果该记录具有依赖关系并且无法删除,则不执行任何操作。为了知道动作发生了,我保留了 Status 变量。但是,无论如何,它总是结果为空。我哪里错了。

C#:( Linq 到实体)

0 投票
4 回答
6217 浏览

php - count() 在 laravel 中返​​回软删除的项目

我有一个Comments使用软删除的模型:它one-to-many与我的Post模型有关系。

我的网站将有一个与之关联的本机移动应用程序,当我发送有关帖子的信息时,我需要向它发送评论计数,并且由于某种原因,它会返回带有软删除项目的计数。

我已经让 Post 数组正常工作并使用发送评论计数

在我的帖子模型中。我也试过

同样在定义关系时,我尝试添加->whereNUll('deleted_at')到 the->hasMany('Comment')和 the 中->belongsTo('Post'),但没有成功。

我检查了数据库并运行了我期望 Fluent 和 Eloquent 生成的 SQL

(31 是我用来测试的帖子)。没有任何工作。让我知道你们是否需要查看更多特定功能,因为我不想发布我的整个模型。

0 投票
2 回答
656 浏览

ios - 使用 Core Data 和服务器同步实现软删除或存档的最佳方式

我正在尝试使用两个标志将 iphone 应用程序与 Web 服务器同步-已同步和 is_deleted,如此处所述https://stackoverflow.com/a/5052208

当用户删除应用程序中的项目时,我将 is_deleted 标志设置为 true。现在我想确保该对象不再出现在我的应用程序中,因为它已被删除(例如在表格视图中),但我需要保留该对象以执行同步。所以这是一个问题:

默认情况下,将所有带有 is_deleted 标志的对象排除在应用程序中的最佳方法是什么?

我现在可以想到两个选择:

  1. 让应用程序中的几乎每个查询都检查项目是否已删除 - 似乎根本不是很有效

  2. 找到一种更通用的方法来自动从应用程序中排除所有 is_deleted=YES 对象,例如通过覆盖 awakeFromFetch 或其他方法。但我不确定如何从上下文中排除对象,而是将它们保存在数据库中以进行同步。

做这个的最好方式是什么?#2甚至可能吗?