使用对SaveChanges()的单个调用修改多个数据库集/实体



我正在开发一个.NET Core Web API,该API需要使用EF Core 5.0.2与Azure SQL数据库进行交互。

我有不同的存储库方法,在这些方法中,我与DbContext交互以添加/编辑/删除不同DbSet的记录。

例如:

UserRepository.AddUser(userdata);

AddUser的实现是这样的,

ourDbContext.UserTable.AddAsync(userdata);

所以在用户服务方法中,我依次调用不同的存储库方法,而这些方法都没有单独调用ourDbContext.SaveChangesAsync()。在所有存储库方法调用之后,会出现对SaveChanges的单个调用,这就像所有调用作为单个事务的工作单元模式一样。

示例:

UserRepository.AddUser(userdata);
ActivityRepository.AddActivity("New User got added");
ourDbContext.SaveChangesAsync();

所以我的问题是:如果对任何表/实体的任何保存更改都失败了,以前成功的表更改会被回滚吗?

例如,假设这个操作

UserRepository.AddUser(userdata);

成功,并且新的用户记录已添加到"用户"表中。

但这并不成功:

ActivityRepository.AddActivity("New User got added");

因此,Activity表中没有添加任何活动记录。

SaveChangesAsync()是否能够自动处理这种情况,并将回滚用户表的新更改?

如果不是,我们是否应该用事务范围来包装上述代码?或者推荐的方法是什么。

简要介绍DbContext's更改跟踪器的工作原理:

  • 加载实体:ChangeTracker会记住所有加载实体的当前值(使用AsNoTracking()除外(
  • 您已经修改了已加载的实体,删除、添加新实体
  • 调用SaveChanges:ChangeTracker开始通过与以前的值进行比较来搜索自上次加载以来更改的对象
  • 生成DMLSQL,并将所有内容保存在事务中的一个SQL语句或多个语句中

因此,如果每个存储库都有一个DbContext,则无需担心回滚,只需不调用SaveChanges()即可。为了确保重新启动过程,您必须重新创建DbContext,因为它包含不需要的状态。

最新更新