Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在单个事务中执行不同服务中的多个EF Core save更改?_C#_Entity Framework_Ef Core 2.2 - Fatal编程技术网

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()
也会同时影响多个表


这似乎是一个很好的链接:

您可以通过创建一个注入服务的单例处理程序来实现这一点

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


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

您可以从一个上下文启动事务并将其用于另一个上下文,然后提交一次。但是在这之前,最好考虑一下,对于您的用例来说,拆分上下文是否真的是一个正确的决定。