我面临一个问题:我们有一个带有EF Core 2.2的ASP.NET Core 2.2 Web API项目。我们正在使用默认的IOC框架来创建具有作用域生存期的DbContext
。而且,我们有一个连接到我们的ASP.NET Web API服务的套接字管道。
我发现,当我们在Web前端中更改数据时,套接字管道将始终获得旧结果(我们使用.FirstOrDefault()
来获取数据,这不是第一级缓存的问题)。
因此,我推断可能是因为DbContext
的作用域生存期,所以我将其更改为瞬态生存期。而且有效!我们得到了修改后的记录。
我有两个问题:
DbContext
的设计行为吗?或者我的代码中有一些棘手的问题。DbContext
会花费多少性能?因为也许我会使每个DbContext
瞬变答案 0 :(得分:0)
1)DbContext的行为是设计使然吗?
是
对于结果集中的每个项目如果这是一个跟踪查询,EF将检查 如果数据代表更改跟踪器中已经存在的实体 如果是,则返回现有实体;否则,返回一个新的 实体已创建,更改跟踪已设置,新实体为 返回
2)瞬态生存期DbContext将花费多少性能?
很少。特别是在具有DbContext Pooling
的ASP.NET Core中因为也许我将使每个DbContext变为瞬态
但是您不应该这样做。使用请求范围的DbContext非常有用。例如,您可以在应用程序的各个层中使用DbContext,而不必传递它们,并且可以更轻松地管理事务。