C# 我应该如何处理实体框架中可能大量的编辑?

C# 我应该如何处理实体框架中可能大量的编辑?,c#,entity-framework,C#,Entity Framework,我首先使用.NET4.5.1和EF6.0.2以及db 用例如下所示: 大约加载了50k个实体 将为用户显示一组这些实体,其他实体是正确显示项目所必需的 用户可能会对实体执行繁重的操作,这意味着用户选择执行一个级联操作,从而实际影响数百个实体 更改将保存回数据库 那么,问题是,处理这一问题的最佳方式是什么?到目前为止,我已经提出了两种不同的解决方案,但两种都不太喜欢: 在步骤1创建DbContext。在整个过程中保留它,最后保存更改。我不喜欢这样做的原因是,这个过程可能需要几个小时,据我所知,db

我首先使用.NET4.5.1和EF6.0.2以及db

用例如下所示:

  • 大约加载了50k个实体
  • 将为用户显示一组这些实体,其他实体是正确显示项目所必需的
  • 用户可能会对实体执行繁重的操作,这意味着用户选择执行一个级联操作,从而实际影响数百个实体
  • 更改将保存回数据库
  • 那么,问题是,处理这一问题的最佳方式是什么?到目前为止,我已经提出了两种不同的解决方案,但两种都不太喜欢:

  • 在步骤1创建DbContext。在整个过程中保留它,最后保存更改。我不喜欢这样做的原因是,这个过程可能需要几个小时,据我所知,dbcontext不应该保留这么长时间
  • 在步骤1创建DbContext。之后立即丢弃。在步骤4,创建一个新的DbContext,将修改后的实体附加到它并保存更改。我看到这种方法的一个大问题是,我如何找出哪些实体实际上已经改变了?我是否需要建立自己的ChangeTracker才能做到这一点
  • 那么,有没有更好的方法来处理这个问题,或者我应该使用上面的解决方案之一(可能需要做一些修改)

    据我所知,DBContext不应该保留这么长时间

    HäH

    在db上下文中,没有什么不保留它的。您可能会遇到其他人已经编辑了项目的问题,但这是一个固有的架构问题-通常不建议在“多小时编辑马拉松”中使用乐观和悲观锁定


    如果您在数小时内进行编辑,唯一明智的方法是使用您自己的更改跟踪器,并在更改时使用适当的逻辑-和/或使用逻辑锁定机制(数据库中的标志)。

    我将使用选项1-在整个过程中使用DbContext

    我的问题在于断言
    这个过程可能需要几个小时。我不认为这是你想做的事。想象一下,当用户编辑数据3个小时后,在单击最终保存之前面临断电时会发生什么情况。你会有用户用干草叉追你

    您还面临许多并发问题——如果两个用户同时执行同一个冗长的过程会怎么样?在几个小时的工作之后处理冲突将是一个问题,特别是如果您告诉用户他们在几个小时前所做的更改无法保存。又是干草叉

    因此,我认为您应该使用第3种方法—保存编辑过程中的增量更改,这样在发生错误时用户的工作不会丢失,并且如果两个用户同时更新数据,您可以处理冲突


    您可能希望将增量更改保留在单独的位置,而不是主表中,因为业务更改尚未最终确定。

    希望
    您将有用户用干草叉跟踪您。