.net 如果在服务中使用Context.SaveChanges,在何处调用它

vxf3dgd4  于 2023-02-17  发布在  .NET
关注(0)|答案(1)|浏览(94)

我正在构建一个.Net WebApi,我把逻辑抽象出来,这样我就可以使用单元测试来测试它。我使用实体框架,DbContext是由DI注入的。
数据流如下所示:

[controller] -> [Service] -> [Controller]

为了对服务进行单元测试,我模拟了DbContext和其他所有内容,并测试了服务

[Test] -> [Service] -> [Test]

目前还没什么特别的。
现在,例如,如果我想添加一个兴趣点,然后在服务中,我做这样的事情:

public class CreatePoiService{

   public void InsertPoi(PoiData data){
      DbContext.Pois.Add(data);
      DbContext.SaveChanges();
   } 

}

这没问题。但是现在我有一个控制台应用程序,它导入了100000个兴趣点。虽然这个控制台应用程序使用了相同的InsertPoi函数,但每次插入后都会调用DbContext.SaveChanges(),这会减慢速度,因为最好在N次插入后才调用。
所以我给Service类添加了一个函数:

public class CreatePoiService{

   private bool SaveToContext = true;

   public void InsertPoi(PoiData data){
      DbContext.Pois.Add(data);
      if(SaveToContext) DbContext.SaveChanges();
   } 

}

现在我可以在控制台应用程序中调用CreatePoiService.SaveToContext = false,而不是让EF执行更改。而且我可以在控制台应用程序本身中调用SaveChanges。这工作得很好。但我仍然怀疑是否有更好的方法来做到这一点?

rhfm7lfc

rhfm7lfc1#

正常的模式是您的服务 * 将 * 调用SaveChanges,但您仍然可以跨多个服务调用来限定transaction的范围。
事务将控制服务保存的所有更改的持久性,因为它们都共享一个DbContext示例作为Scoped依赖项。

相关问题