EF Core 2.2:多次使用同一DbContext实例从数据库获取记录,结果始终相同

时间:2019-07-05 03:38:29

标签: entity-framework inversion-of-control ef-core-2.2

我面临一个问题:我们有一个带有EF Core 2.2的ASP.NET Core 2.2 Web API项目。我们正在使用默认的IOC框架来创建具有作用域生存期的DbContext。而且,我们有一个连接到我们的ASP.NET Web API服务的套接字管道。

我发现,当我们在Web前端中更改数据时,套接字管道将始终获得旧结果(我们使用.FirstOrDefault()来获取数据,这不是第一级缓存的问题)。

因此,我推断可能是因为DbContext的作用域生存期,所以我将其更改为瞬态生存期。而且有效!我们得到了修改后的记录。

我有两个问题:

  1. DbContext的设计行为吗?或者我的代码中有一些棘手的问题。
  2. 瞬变寿命DbContext会花费多少性能?因为也许我会使每个DbContext瞬变

1 个答案:

答案 0 :(得分:0)

1)DbContext的行为是设计使然吗?

  

对于结果集中的每个项目如果这是一个跟踪查询,EF将检查   如果数据代表更改跟踪器中已经存在的实体   如果是,则返回现有实体;否则,返回一个新的   实体已创建,更改跟踪已设置,新实体为   返回

How Queries Work

  

2)瞬态生存期DbContext将花费多少性能?

很少。特别是在具有DbContext Pooling

的ASP.NET Core中
  

因为也许我将使每个DbContext变为瞬态

但是您不应该这样做。使用请求范围的DbContext非常有用。例如,您可以在应用程序的各个层中使用DbContext,而不必传递它们,并且可以更轻松地管理事务。