Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何加载根对象及其';使用EntityFramework基于IsDeleted=true的子实体_C#_Entity Framework_C# 4.0_Entity Framework 4 - Fatal编程技术网

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

C# 如何加载根对象及其';使用EntityFramework基于IsDeleted=true的子实体,c#,entity-framework,c#-4.0,entity-framework-4,C#,Entity Framework,C# 4.0,Entity Framework 4,我必须使用EntityFramework实现软删除 我的数据库表有一个位列IsDeleted 相应的实体也有IsDeleted字段 当用户删除一个子实体时,该子对象的被删除设置为true,并得到很好的持久化 在加载实体对象图时,我希望确保所有相关实体都加载了一个条件IsDeleted=false 它尝试使用以下链接的帮助,但我得到了很多错误: 以下是每个实体的错误: 错误3032:映射从第38行开始的片段时出现问题:映射了条件不是“IsNull=False”的条件成员。删除EntityHav

我必须使用EntityFramework实现软删除

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

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


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

您将
EntityHavingClause.IsDeleted
映射为属性和条件。你不能两者兼而有之

遵循链接到的示例时,不需要属性映射

编辑:

由于同时需要属性和条件,最好的方法可能是向数据库表中添加一个计算列,该列只显示IsDeleted的值(如果可以更改模式,也就是说)。然后将条件映射到计算列


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

您将
EntityHavingClause.IsDeleted
映射为属性和条件。你不能两者兼而有之

遵循链接到的示例时,不需要属性映射

编辑:

由于同时需要属性和条件,最好的方法可能是向数据库表中添加一个计算列,该列只显示IsDeleted的值(如果可以更改模式,也就是说)。然后将条件映射到计算列


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

这并不容易。正如@GertArnold所指出的,如果您想在条件中使用Column,则无法对其进行映射,同时,如果未映射Column,懒惰和急切的加载将不会使用您的条件。每个列只能映射一次,条件为映射

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


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

这并不容易。正如@GertArnold所指出的,如果您想在条件中使用Column,则无法对其进行映射,同时,如果未映射Column,懒惰和急切的加载将不会使用您的条件。每个列只能映射一次,条件为映射

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


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

谢谢GertArnold!!但我不能准确地跟踪链接,因为我来回地将整个实体对象图映射到BLL对象图。我无法传递对象conext的引用。它的设计方式是,BLL的客户机可以将对象标记为IsDeleted=true,它将被复制到entti并传递给DAL进行持久化。我正面临加载对象,IsDeleted=false作为过滤器。还有别的办法吗?谢谢GertArnold!!但我不能准确地跟踪链接,因为我来回地将整个实体对象图映射到BLL对象图。我无法传递对象conext的引用。它的设计方式是,BLL的客户机可以将对象标记为IsDeleted=true,它将被复制到entti并传递给DAL进行持久化。我正面临加载对象,IsDeleted=false作为过滤器。还有别的办法吗?