entity-framework - 使用 Entity Framework 进行软删除(“历史记录”列)

标签 entity-framework soft-delete

我正在使用一个数据库,设计师在数据库中决定用IsHistorical位列标记每个表。没有考虑适当的建模,也没有办法更改架构。

在开发与导航属性交互的CRUD屏幕时,这会引起一些摩擦。我不能简单地购买一个产品,然后编辑其EntityCollection,而必须在整个地方手动编写IsHistorical检查,这会使我发疯。

添加也很可怕,因为到目前为止,我已经进行了所有手动检查,以查看添加是否只是软删除,因此无需添加重复的实体,我只需切换IsHistoric。

我考虑过的三个选项是:

  • 修改t4模板以包括IsHistorical检查和同步。
  • 拦截ObjectContext中的删除和添加,切换IsHistorical列,然后同步对象状态。
  • 订阅AssociationChanged事件,并在那里切换IsHistorical列。

  • 是否有人对此有任何经验或可以推荐最轻松的方法?

    注意:是的,我知道,这是错误的建模。我已经阅读了有关软删除的相同文章。我必须处理这个要求,但是我确实很讨厌。我只想要最轻松的方法来处理软删除,而无需为数据库中的每个导航属性编写相同的代码。

    注意#2 LukeLed的回答在技术上是正确的,尽管它会迫使您陷入一个非常糟糕的困境,从而使ORM(无图形)模式成为现实。答案是正确的。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。问题在于,现在我需要从图中提取所有“已删除”的对象,然后在每个对象上调用Delete方法。那真的不会为我节省那么多的手工仪式编码。现在,我不再编写手动的IsHistoric检查,而是收集已删除的对象并遍历它们。

    最佳答案

    如您所知,您无法修改架构时,将不会有一个很好的解决方案。鉴于您不喜欢“存储库”选项(不过,我想知道您是否不急于取消它),这是我能想到的最好的选择:

  • 处理ObjectContext.SavingChanges
  • 当该事件触发时,遍历ObjectStateManager以查找处于已删除状态的对象。如果它们具有IsHistorical属性,请进行设置,然后将对象的状态更改为Modifyed。

  • 当涉及到关联/关系时,这可能会变得棘手,但我认为它或多或少地满足了您的需求。

    关于entity-framework - 使用 Entity Framework 进行软删除(“历史记录”列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1942532/

    相关文章:

    c# - 使用 Entity Framework 4 使用 Web Api 返回复杂对象

    c# - 继承上下文时避免从基本 EF Core 3.0 模型重新建模对象

    sql-server - 数据库拦截导致 SQL 嵌套太深

    azure - 在认知搜索中,数据显示在删除后。如何删除该数据?

    azure - Dot.Net Core 中的 Azure blob 容器中的软删除 blob 文件

    c# - 添加时出现 DbUpdateConcurrencyException

    entity-framework - DbSet<> 和虚拟 DbSet<> 有什么区别?

    asp.net-mvc - WebGrid 和 EF4 属性

    django - Django 中具有唯一约束的软删除

    symfony - 如何使用 symfony 2 使工作软删除和唯一实体