C# 无法使用删除⇒;使用实体框架添加或更新序列

C# 无法使用删除⇒;使用实体框架添加或更新序列,c#,orm,entity-framework-6,crud,C#,Orm,Entity Framework 6,Crud,我有一个方法可以删除一组实体 我有一个方法可以添加或更新一组实体 这些方法是独立有用的,但它们在实体框架中协同工作时存在问题 问题是,在删除一组实体(例如(a、B、C、D)后,解析到其中一个或多个记录的后续查询总是返回缓存的垃圾副本,其属性值在删除过程中为空。中间的DbContext.SaveChanges解决了这个问题,但会带来额外的开销,使操作处于半完成状态,因此它还必须包装在另一个事务中 最好的处理方法是什么 我是否应该避免一个包含删除和添加/更新操作的API,而选择一个预先的混合操作来

我有一个方法可以
删除一组实体

我有一个方法可以添加或更新一组实体

这些方法是独立有用的,但它们在实体框架中协同工作时存在问题

问题是,在删除一组实体(例如(a、B、C、D)后,解析到其中一个或多个记录的后续查询总是返回缓存的垃圾副本,其属性值在删除过程中为空。中间的
DbContext.SaveChanges
解决了这个问题,但会带来额外的开销,使操作处于半完成状态,因此它还必须包装在另一个事务中

最好的处理方法是什么

  • 我是否应该避免一个包含删除和添加/更新操作的API,而选择一个预先的混合操作来确定哪些操作实际被删除,哪些操作仍然需要更新?或
  • 我是否应该保留这两个有用的方法,并将这两个步骤包装在一个事务作用域中,以便在删除后立即保存对上下文的更改,允许后续的添加/更新正确反映它们的删除,同时在最后仍然能够提交或回滚(例如,如果可以/无法设置新权限)
我不希望使用较低级别的操作,例如关闭跟踪或附着/分离实体

假设实体是权限。业务逻辑规定,我应该使用逻辑上的两步流程来重置用户的权限,首先删除我有权删除的任何权限,然后立即尝试添加/更新允许我分配的任何新权限

当用两个单独的步骤来处理这个问题时,我遇到了如下问题。我遇到的第一个问题是,在删除一组权限实体(如(a、B、C、D)后,entity framework会立即损坏对象属性,将其中许多属性设置为null(可能是为了切断外键关系)。问题在于,由于实体仍然存在于数据库中,当尝试“添加或更新”数据库中仍有记录但已在上下文中删除的权限时,EF始终返回该权限的缓存/垃圾副本。所以虽然我已经移除了实体。。。在同一个上下文中,我实际上无法确定是否需要重新附加/更新它或直接添加新实体。换句话说,框架返回一个实体,尽管它被标记为已删除,但它仍然存在(因为它仍然存在于数据库中),但该实体对象具有垃圾/空数据,因此我甚至无法判断添加一个新实体是否安全,或者我应该尝试“取消删除”现有实体

在我看来,这样的删除/添加或更新模式对于这种实体框架(甚至是一般的ORMs)根本不好。相反,我必须在一个预先操作中确定是否有任何新权限已经存在,这样我就可以有选择地删除正在消失的权限,同时更新刚刚重新分配的权限(例如,新的访问级别)