如何在单个事务中执行不同服务中的多个EF Core保存更改



在我的应用程序中,我有一个Mediator处理程序,它通过DI注入了DBContext和2个服务。这些服务中的每一个都有自己的DBContext,也通过DI注入。

我有没有办法在单个EF Core事务中执行处理程序和服务中执行的所有工作?

我能想到的唯一方法是处理程序新建每个服务,并将其DBContext的实例传递给每个服务,然后在处理程序结束时调用SaveChanges。这是可行的,但我想知道是否有更好的方法可以让我不必自己实例化每个服务。

我认为您正在寻找工作单元模式。在本例中,您将创建一个工作单元对象,该对象具有对DbContext的引用。在任何地方,您都可以注入您的工作单元,而不是DbContext。由于这是同一范围内的同一对象,因此您的所有服务也将使用相同的DbContext引用。对SaveChanges()的调用也会同时影响多个表。

这似乎是一个很好的链接:https://cpratt.co/repository-and-unit-of-work-patterns-with-entity-framework/

您可以通过制作注入到服务中的单例处理程序来实现这一点。

你想做的是你不能做的事情!首先,跨多个服务的操作往往需要时间,这意味着您的交易将打开一段时间。第二,如果客户中断并且没有完成操作链,您的交易将保持开放状态。第三,您将很难处理并发操作。

一种更好的方法是通过将数据存储在一个临时标志中来模拟事务,该标志在最后被清除,或者在需要回滚时用于删除记录。

相关内容

  • 没有找到相关文章

最新更新