C# 如何在单个事务中执行不同服务中的多个EF Core save更改?
在我的应用程序中,我有一个处理程序,它有一个C# 如何在单个事务中执行不同服务中的多个EF Core save更改?,c#,entity-framework,ef-core-2.2,C#,Entity Framework,Ef Core 2.2,在我的应用程序中,我有一个处理程序,它有一个DBContext和两个通过DI注入的服务。每个服务都有自己的DBContext,也通过DI注入 我是否有办法在单个EF核心事务中执行处理程序和服务中执行的所有工作 我能想到的唯一方法是处理程序更新每个服务,并将其DBContext实例传递给每个服务,并在处理程序末尾调用SaveChanges。这会起作用,但我想知道是否有更好的方法,不必自己实例化每个服务。我想您正在寻找工作单元模式。在这里,您将创建一个工作单元对象,该对象具有对DbContext的引
DBContext
和两个通过DI注入的服务。每个服务都有自己的DBContext
,也通过DI注入
我是否有办法在单个EF核心事务中执行处理程序和服务中执行的所有工作
我能想到的唯一方法是处理程序更新每个服务,并将其
DBContext
实例传递给每个服务,并在处理程序末尾调用SaveChanges
。这会起作用,但我想知道是否有更好的方法,不必自己实例化每个服务。我想您正在寻找工作单元模式。在这里,您将创建一个工作单元对象,该对象具有对DbContext的引用。在任何地方,都可以注入工作单元,而不是DbContext。因为这是同一范围内的同一对象,所以您的所有服务也将使用相同的DbContext引用。调用SaveChanges()
也会同时影响多个表
这似乎是一个很好的链接:您可以通过创建一个注入服务的单例处理程序来实现这一点 你想做的是你不能做的事!首先,跨多个服务的操作往往需要时间,这意味着您的事务将打开一段时间。其次,如果客户中断并没有完成操作链,您的交易将保持开放状态。第三,您将很难处理并发操作
更好的方法是通过使用临时标志存储数据来模拟事务,在最后清除临时标志,或者在需要回滚时删除记录。您可以从一个上下文启动事务并将其用于另一个上下文,然后提交一次。但是在这之前,最好考虑一下,对于您的用例来说,拆分上下文是否真的是一个正确的决定。