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)
您可以使用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)