多个异步函数期间的.Net EF核心DbContext.Save()

时间:2016-10-28 12:47:07

标签: c# asp.net entity-framework asynchronous asp.net-core

我对dbcontext.SaveChanges()的困惑感到困惑。根据文档SaveChanges()应保存对数据库所做的所有更改。

考虑我有多个Async函数的情况,所有这些函数都针对不同的表。如果所有这些都尝试创建新条目但有些需要更长时间(由于计算处理等),则第一个函数到达dbcontext.SaveChanges()会保存其他异步函数所做的所有更改,无论这些函数是否已到达SaveChanges部分?

所以我担心的是,在多个异步函数中,数据将在BusinessFlow之前保存,因为另一个函数表示SaveChanges()。

是这种情况还是为每个异步创建一些内部事务范围?

可以在https://github.com/drakoumel/DatacircleAPI/blob/master/Startup.cs

找到Startup.cs

1 个答案:

答案 0 :(得分:2)

因此,要了解所有这些行为,您需要知道您的上下文和存储库在DI容器中的注册时间和生命周期。

上下文注册如下:

services.AddDbContext<ApplicationDbContext>(options => options.UseMySql(Configuration["ConnectionStrings:DefaultConnection"]));

如果您将查看AddDbContext方法的参数,您将看到它具有contextLifetime参数,默认值为ServiceLifetime.Scoped。所以上下文是在Scoped生命周期中注册的。

存储库注册为

services.AddScoped<IDatasourceRepository, DatasourceRepository>();

所以,也是在Scoped的生命周期。 什么作用寿命意味着什么?它只是意味着在DI容器中解析时,每个请求创建新对象。所以现在您知道您的存储库的单个实例和上下文每个请求,因此,对控制器操作的不同调用使用不同的上下文实例,因此它们的SaveChanges不会相互干扰。