实体框架并不总是从数据库中获得最多的更新值

Ash*_*our 1 c# entity-framework dependency-injection autofac

我在 EF 缓存数据方面遇到了一个奇怪的问题,并且只能获取创建 DB 内容时的值。

这是一个问题,因为 DB 上下文被注入到承包商上。

我已将 LazyLoadingEnabled 设置为 false。

EF 已首先设置为数据库,这将被更改,因此它首先编码。

我正在使用 autofac 进行依赖注入。

我知道下面的演示很奇怪,但这是解释它的最简单方法。

因此,如果我调用以下代码,但如果我在每个 GetFooById 上放置一个断点,我将进入 SQL 数据库并更改 foo 表中的值,它将不会加载新的更改,它将加载值,就像以前一样我已开始。

var item1 = _fooService.GetFooById(1);
var item2 = _fooService.GetFooById(1);
var item2 = _fooService.GetFooById(1);
Run Code Online (Sandbox Code Playgroud)

我想知道如何让 EF 总是从数据库中获得最多的更新值。我的 foo 服务看起来像这样

private readonly DBEntities _dbContext;

    public FooService(DBEntities  dbContext)
    {
        _dbContext= dbContext;
    }

    public Foo GetFooById(int id)
    {
        return  _dbContext.Foo.First(x => x.Id== id);
    }
Run Code Online (Sandbox Code Playgroud)

autofac 看起来像

builder.RegisterAssemblyTypes(ThisAssembly)
  .Where(t => t.Name.EndsWith("Service"))
  .WithParameter("dbContext", new DBEntities())
  .AsImplementedInterfaces();
Run Code Online (Sandbox Code Playgroud)

Cyr*_*and 7

您可以使用AsNoTracking方法禁用实体框架缓存。

public Foo GetFooById(int id)
{
    return  _dbContext.Foo.AsNoTracking().First(x => x.Id== id);
}
Run Code Online (Sandbox Code Playgroud)

有关如何使用 Entity Framework 禁用缓存的更多信息,请参阅实体框架缓存破坏

使用 Entity Framework Core,您还可以在上下文级别更改此设置:

context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
Run Code Online (Sandbox Code Playgroud)