【发布时间】:2021-09-19 01:35:48
【问题描述】:
我正在开发一个 .NET Core Web 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() 是否能够自动处理这种情况并回滚用户表的新更改?
如果不是,我们是否应该用事务范围包装上述代码?或者推荐的方法是什么。
【问题讨论】:
-
A DbContext 是一个多实体 工作单元。像这样拥有多个“存储库”会打破这一点。此外,只有 CRUD 方法的类是Data Access Objects,而不是存储库。 DbContext 之上的真实存储库将在比单个实体更高 级别抽象操作。例如,在调用
SaveChanges之前检索客户的订单、添加新商品并更新客户的奖励积分以一次保存所有更改
标签: sql entity-framework-core transactionscope