【问题标题】:Entity Framework not always get the most update values from the db实体框架并不总是从数据库中获取最多的更新值
【发布时间】:2018-02-23 17:50:42
【问题描述】:

我在使用 EF 缓存数据时遇到了一个奇怪的问题,并且只能在创建数据库连接时获取值。

这是一个问题,因为数据库上下文是在承包商身上注入的。

我已将 LazyLoadingEnabled 设置为 false。

EF 已首先设置为数据库,这将是一些将被更改的内容,因此它首先编码。

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

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

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

var item1 = _fooService.GetFooById(1);
var item2 = _fooService.GetFooById(1);
var item2 = _fooService.GetFooById(1);

我想知道如何使 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);
    }

autofac 看起来像

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

【问题讨论】:

  • 请显示您的 DI 启动代码(特别是注册您的 DBContext 的部分)并说明这是什么类型的应用程序(控制台、WPF、ASP.NET MVC 等)。
  • 你最好按照stackoverflow.com/questions/10777630/…重新设计你的服务

标签: c# entity-framework dependency-injection autofac


【解决方案1】:

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

public Foo GetFooById(int id)
{
    return  _dbContext.Foo.AsNoTracking().First(x => x.Id== id);
}

有关如何使用 Entity Framework 禁用缓存的更多信息,请参阅 Entity Framework Cache Busting

使用 Entity Framework Core,您还可以在 the context level 更改此设置:

context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;

【讨论】:

    【解决方案2】:
    yourContext.Entry(yourEntity).Reload();
    

    来自this answer

    【讨论】:

      猜你喜欢
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-15
      • 2011-04-28
      • 2011-04-26
      • 1970-01-01
      • 2017-02-08
      相关资源
      最近更新 更多