我正在开发一个.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
,因为它包含不需要的状态。