我必须使用权利框架实现软删除。
IsDeleted
。IsDeleted
字段。 IsDeleted
设置为true并保持良好状态。 IsDeleted
= false。 以下是我为每个实体获得的错误:
错误3032:从第38行开始映射片段时出现问题:映射了条件成员,其条件不是“IsNull = False”。删除EntityHavingClause.IsDeleted上的条件或将其从映射中删除。
问:任何人都可以告诉我哪里出错了,加载IsDelete
= false的所有儿童权利的最简单方法是什么?
答案 0 :(得分:1)
您将EntityHavingClause.IsDeleted
映射为属性和作为条件。你不能两者兼顾。
当您按照链接的示例进行操作时,您不应该需要属性映射。
修改强>
正如你需要的那样,属性和条件,可能是最好的方法是将一个计算列添加到数据库表中,该列只显示IsDeleted的值(如果你可以改变模式,那就是)。然后将条件映射到计算列。
我认为这比试图破解EF两次映射同一列(如果可以完成)更容易。
答案 1 :(得分:0)
这并不容易。正如@GertArnold指出的那样,如果你想在条件中使用它,就不能有colum映射,同时懒惰和急切加载如果没有映射就不会使用你的条件。每列只能映射一次,条件映射。
诀窍在于,一旦你想要软删除,就不能指望你的业务逻辑能够处理它。它将成为EF的责任。您将需要映射的存储过程来删除实体的操作,该操作将设置IsDeleted
字段而不是执行实际删除。可以直接映射SQL命令而不使用存储过程,但设计器不支持 - 您必须手动维护EDMX文件为XML。
您的模型不支持实际删除实体,使用此模型时,您永远无法访问软删除的实体。这就是实体框架的软删除工作原理。如果您需要真正删除或访问软删除的实体,您将需要另一个模型(另一个EDMX),其中实体将再次映射而无需软删除,或者您将不得不使用一些技巧来欺骗第一个EDMX并再次映射实体(数据库视图)或者表别名)。