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

Entity framework EF Core 2.2:多次使用同一DbContext实例从数据库中获取记录,结果始终相同,entity-framework,inversion-of-control,ef-core-2.2,Entity Framework,Inversion Of Control,Ef Core 2.2,我面临着一个问题:我们有一个ASP.NETCore2.2WebAPI项目,其中包含EFCore2.2。我们使用默认的IOC框架来创建具有作用域生存期的DbContext。我们有一个套接字管道连接到我们的ASP.NETWebAPI服务 我发现,当我们在web前端更改数据时,套接字管道将始终获得旧的结果(我们使用.FirstOrDefault()来获取数据,这不应该是一级缓存的问题) 所以我推断这可能是因为DbContext的作用域生存期,所以我将其更改为瞬态生存期。而且它有效!我们得到了修改过的记

我面临着一个问题:我们有一个ASP.NETCore2.2WebAPI项目,其中包含EFCore2.2。我们使用默认的IOC框架来创建具有作用域生存期的
DbContext
。我们有一个套接字管道连接到我们的ASP.NETWebAPI服务

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

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

我有两个问题:

  • 这是设计的
    DbContext
    行为吗?或者我的代码中有一些棘手的问题
  • 瞬态生存期
    DbContext
    需要多少性能?因为我可能会让每个
    DbContext
    都是瞬态的
  • 1) DbContext的这种行为是设计的吗

    对于结果集中的每个项目(如果这是跟踪查询),EF检查 如果数据表示已在更改跟踪程序中的实体 如果是,则返回现有实体;如果不是,则返回新实体 创建实体,设置更改跟踪,并创建新实体 返回

    2) 瞬时生存期DbContext需要多少性能

    很少。特别是在ASP.NET内核中,它具有

    因为也许我会让每个DbContext都是暂时的


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

    创建一个新的DbContext一点也不昂贵:关于您遇到的其他问题,我不明白您的意思。谢谢,David!因此,我仍然使用作用域生存期,但将Get方法更改为无跟踪方法。你能给我一些建议吗?