如何使用EntityFramework基于IsDeleted = true加载根对象及其子实体

时间:2012-01-24 17:54:29

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

我必须使用权利框架实现软删除。

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

以下是我为每个实体获得的错误:

  

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

问:任何人都可以告诉我哪里出错了,加载IsDelete = false的所有儿童权利的最简单方法是什么?

2 个答案:

答案 0 :(得分:1)

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

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

修改

正如你需要的那样,属性和条件,可能是最好的方法是将一个计算列添加到数据库表中,该列只显示IsDeleted的值(如果你可以改变模式,那就是)。然后将条件映射到计算列。

我认为这比试图破解EF两次映射同一列(如果可以完成)更容易。

答案 1 :(得分:0)

这并不容易。正如@GertArnold指出的那样,如果你想在条件中使用它,就不能有colum映射,同时懒惰和急切加载如果没有映射就不会使用你的条件。每列只能映射一次,条件映射。

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

您的模型不支持实际删除实体,使用此模型时,您永远无法访问软删除的实体。这就是实体框架的软删除工作原理。如果您需要真正删除或访问软删除的实体,您将需要另一个模型(另一个EDMX),其中实体将再次映射而无需软删除,或者您将不得不使用一些技巧来欺骗第一个EDMX并再次映射实体(数据库视图)或者表别名)。