【问题标题】:Grouping changes to save in Entity Framework Core将更改分组以保存在 Entity Framework Core 中
【发布时间】:2017-09-01 00:26:22
【问题描述】:

我正在运行一个进程,该进程会影响用户数据库中的许多记录。我只想应用所有更改或不应用所有更改,具体取决于所有更改的结果。 (例如,如果其中一个子流程失败,则总体上不应发生任何更改)。我还想将通知保存到数据库中,以提醒用户进程的结果(例如,如果子进程失败,则会发出通知,让用户知道由于 x 原因没有进行任何更改)。

我能想到的最好方法是在添加更改跟踪器时分离所有条目,然后在成功或失败时创建通知并保存更改,然后在应用所有更改时我可以遍历更改跟踪器并重置Entity State 并再次保存更改。

我使用这种方法面临的问题是,在重置Entity State 时,我不知道实体是Added 还是Modified。我可以实现自己的更改跟踪器来存储实体的先前状态,但这会使 EF 的更改跟踪器变得多余。

我也只能在保存实体时添加所有实体的权限,但这需要将许多对象传递到嵌套方法的链中直到结束。

有没有人有更好的建议,或者使用提到的其中一种技巧来解决这个问题是标准做法吗?

【问题讨论】:

    标签: c# entity-framework-core


    【解决方案1】:

    听起来您正在尝试实现工作单元模式。 EntityFramework 的DbContext 使得它相当容易使用,因为DbContext 它自己工作单元。

    只需实例化一个新的上下文并对其进行所需的更改。您可以将上下文传递给进行更改的任何函数。一旦“逻辑单元”操作完成,请致电SaveChanges。只要各个方法不调用SaveChanges,您就可以将它们组合成一个单元,在整个逻辑操作完成后提交。一切都将在单个事务中以原子方式提交。数据不会处于不一致的状态。

    【讨论】:

    • 这是我最初使用的方法,但我被建议不要这样做,因为数据库上下文有 500 多个表并且需要相对较长的时间来实例化。我使用这种方法在内存数据库上进行单元测试,它似乎运行良好,但在 SQL 服务器上是这种情况,还是会留下沉重的开销?这也适用于依赖注入,如果是这样,我会创建一个新的服务范围来创建一个新的上下文吗?感谢您的建议。
    • 实例化一个大的DBContext 通常很快。第一次查询时性能受到影响,但每个AppDomain 只能获得一次,从那时起,它被缓存。我看不出它不能与 DI 一起使用的任何原因,您只需要选择一个与您的逻辑操作相匹配的范围。对于像 MVC 这样的东西,通常在 ActionMethod 无论如何。我在 200~250 个大表上使用了这种模式,数据库没有问题,但 500 个表超出了我的经验。可能存在我不知道的性能问题。
    【解决方案2】:

    您谈到了交易。 Using Transactions or SaveChanges(false) and AcceptAllChanges()?

    您也可以在数据库中实现数据的版本。对我来说,这将是更轻松和正确的方式(您必须始终只插入数据而永不更新。一对多)。在这种情况下,您可以简单地删除最后的记录或将它们标记为不活动

    【讨论】:

      猜你喜欢
      • 2020-03-07
      • 1970-01-01
      • 2020-07-21
      • 2017-08-25
      • 2016-12-18
      • 2020-07-14
      • 2020-03-12
      • 2017-07-29
      • 1970-01-01
      相关资源
      最近更新 更多