【问题标题】:How to load a root object and it's child entities based on IsDeleted = true using EntityFramework如何使用 EntityFramework 基于 IsDeleted = true 加载根对象及其子实体
【发布时间】:2012-01-25 03:39:57
【问题描述】:

我必须使用实体框架来实现软删除。

  • 我的数据库表有一个位列IsDeleted
  • 对应的实体也有IsDeleted字段。
  • 当用户删除子实体时,IsDeleted 为该子对象设置为 true 并得到很好的持久化。
  • 在加载实体对象图时,我想确保所有相关实体都加载了条件IsDeleted = false。
  • 它尝试使用以下链接的帮助,但我收到很多错误:handling-logical-delete-with-entity-framework-4

这是我为每个实体得到的错误:

错误 3032:从第 38 行开始映射片段时出现问题:条件成员的条件不是“IsNull=False”被映射。删除 EntityHavingClause.IsDeleted 上的条件或将其从映射中删除。

问:谁能告诉我哪里出错了,以及加载IsDelete = false 的所有子实体的最简单方法是什么?

【问题讨论】:

    标签: c# entity-framework c#-4.0 entity-framework-4


    【解决方案1】:

    您将EntityHavingClause.IsDeleted 映射为属性 作为条件。你不能两者都做。

    当您按照链接到的示例进行操作时,您应该不需要属性映射。

    编辑:

    由于您需要属性和条件,因此最好的方法可能是向您的数据库表添加一个计算列,该列仅显示 IsDeleted 的值(如果您可以更改架构,那就是)。然后将条件映射到计算列。

    我认为这比尝试破解 EF 来映射同一列两次(如果可以的话)更容易。

    【讨论】:

    • 感谢格特阿诺德!!但我不能完全按照链接,因为我将整个实体对象图映射到 BLL 对象图,来回。而且我无法传递对 Object conext 的引用。它的设计方式是他 BLL 的客户端可以将对象标记为 IsDeleted = true,这将被复制到一个 entti 并传递给 DAL 以进行持久性。我正面临加载对象,使用 IsDeleted = false 作为过滤器。有没有其他办法?
    【解决方案2】:

    这并不容易。正如@GertArnold 指出的那样,如果您想在条件中使用它,则不能映射列,同时如果未映射,则延迟和急切加载将不会使用您的条件。每列只能映射一次,条件是映射。

    诀窍是,一旦您想要软删除,您就不能指望您的业务逻辑会处理它。这将成为EF的责任。您需要将存储过程映射到实体的删除操作,这将设置IsDeleted 字段而不是执行真正的删除。可以在不使用存储过程的情况下直接映射 SQL 命令,但设计器不支持 - 您必须手动将 EDMX 文件维护为 XML。

    您的模型不支持实体的真正删除,并且在使用此模型时,您将永远无法访问软删除的实体。这就是使用实体框架进行软删除的方式。如果您需要真正删除或访问软删除的实体,您将需要另一个模型(另一个 EDMX),在该模型中实体将在没有软删除的情况下再次映射,或者您将不得不使用一些技巧首先欺骗 EDMX 并再次映射实体(数据库视图或者可能是表别名)。

    【讨论】:

      猜你喜欢
      • 2020-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多