Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 为什么Entity Framework总是从数据库中获取最新版本的数据,但如果对象已经存在于上下文中,就不使用它?_Entity Framework - Fatal编程技术网

Entity framework 为什么Entity Framework总是从数据库中获取最新版本的数据,但如果对象已经存在于上下文中,就不使用它?

Entity framework 为什么Entity Framework总是从数据库中获取最新版本的数据,但如果对象已经存在于上下文中,就不使用它?,entity-framework,Entity Framework,有人能给我解释一下EntityFramework6缓存的工作方式吗?这对我来说毫无意义 正如我所读到的(并且有经验),Ef将始终查询数据库-但是如果上下文中已经存在数据,那么它将使用旧数据。你为什么要那样做?当然,这只是创建了不必要的数据库读取。如果要获取数据,为什么不总是使用最新版本 从数据库返回结果时,上下文中不存在的对象将附加到上下文。如果一个对象已经在上下文中,则返回现有对象(条目中对象属性的当前值和原始值不会被数据库值覆盖) 有没有办法让EF6在进行这些查询时更新其上下文 编辑: 刷

有人能给我解释一下EntityFramework6缓存的工作方式吗?这对我来说毫无意义

正如我所读到的(并且有经验),Ef将始终查询数据库-但是如果上下文中已经存在数据,那么它将使用旧数据。你为什么要那样做?当然,这只是创建了不必要的数据库读取。如果要获取数据,为什么不总是使用最新版本

从数据库返回结果时,上下文中不存在的对象将附加到上下文。如果一个对象已经在上下文中,则返回现有对象(条目中对象属性的当前值和原始值不会被数据库值覆盖)

有没有办法让EF6在进行这些查询时更新其上下文

编辑: 刷新上下文对我来说不是解决方案的原因是,为了一个小查询,需要运行几个其他查询。基本上,上下文用于获取数千条记录。数据可能会在后台更改,因为我有其他操作在不同的上下文中异步运行

我有一些解决方法,我只是想理解为什么没有一个简单的选项可以使用后续Where查询中检索到的信息更新上下文中的数据

进行此操作:

_context.Products.Where(x=>categoryid==_categoryid);
var p = _context2.Products.FirstOrDefault(x=>x.ProjectId==1);
p.Description = "New Description";
_context2.SaveChanges();
现在如果我运行这个查询

_context.Products.Where(x=>categoryid==_categoryid);
实体框架将获得一个数据集,其中它知道产品1的最新值(“新描述”),但它将完全忽略它,只从原始上下文返回值

你可以:

  • 使用DbEntry.Reload()-但这要求您首先获取实体,然后重新加载它-2次
  • 新上下文(在这里对我来说不是一个好的选择)
  • 是否有类似以下伪代码的选项:

    _context.BeginUpdateCache();
    _context.Products.Where(x=>categoryid==_categoryid);
    _context.EndUpdateCache();
    
    这将导致_context.Products.其中(x=>categoryid==\u categoryid)返回产品1的最新数据库值集-例如(“新描述”)

    有关详细信息,请参阅(&p)。我在这里简要解释一下

    您可以使用
    AsNoTracking()
    扩展方法显式地
    不跟踪实体说上下文。它将应用于
    实体
    级别。你可以像下面那样使用它

    _context.Products.AsNoTracking().Where(x=>categoryid==_categoryid);
    var p = _context2.Products.FirstOrDefault(x=>x.ProjectId==1);
    p.Description = "New Description";
    _context2.SaveChanges();
    _context.Products.AsNoTracking().Where(x=>categoryid==_categoryid); //<- this will return latest object.
    
    // Add below line.
    _context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
    _context.Products.Where(x=>categoryid==_categoryid);
    var p = _context2.Products.FirstOrDefault(x=>x.ProjectId==1);
    p.Description = "New Description";
    _context2.SaveChanges();
    _context.Products.Where(x=>categoryid==_categoryid);
    
    您的完整代码如下所示

    _context.Products.AsNoTracking().Where(x=>categoryid==_categoryid);
    var p = _context2.Products.FirstOrDefault(x=>x.ProjectId==1);
    p.Description = "New Description";
    _context2.SaveChanges();
    _context.Products.AsNoTracking().Where(x=>categoryid==_categoryid); //<- this will return latest object.
    
    // Add below line.
    _context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
    _context.Products.Where(x=>categoryid==_categoryid);
    var p = _context2.Products.FirstOrDefault(x=>x.ProjectId==1);
    p.Description = "New Description";
    _context2.SaveChanges();
    _context.Products.Where(x=>categoryid==_categoryid);
    

    注意根据您的场景,不要在
    \u context2
    上使用
    AsNoTracking()
    QueryTrackingBehavior.NoTracking
    。否则,它将不会从
    FirstOrDefault(x=>x.ProjectId==1)
    跟踪
    实体
    ,也不会跟踪您的
    \u context2.SaveChanges()将没有要保存的更改


    编辑根据您的评论,我猜您也希望从该上下文中更新
    实体
    。在这种情况下,您可以使用下面解释的方法

    var p = _context.Products.AsNoTracking().Where(x=>categoryid==_categoryid);
    _context.Products.Attach(p);
    p.Description = "New Description";
    _context.SaveChanges();
    _context.Products.AsNoTracking().Where(x=>categoryid==_categoryid); //<- this will return latest object saved in database.
    
    var p=\u context.Products.AsNoTracking()。其中(x=>categoryid==\u categoryid);
    _上下文。产品。附件(p);
    p、 Description=“新描述”;
    _SaveChanges();
    
    _context.Products.AsNoTracking(),其中(x=>categoryid===\u categoryid)//强制完全刷新的最简单方法是重新创建上下文:是的,但这对我来说不是一个有效的选择。请参阅编辑的简要说明。非常感谢你。我已经把它标为答案,但严格来说,它并没有给出一个完整的答案。您能否建议是否有任何方法强制原始上下文使用它检索的最新数据?e、 g.like_context.Products.AsNoTracking(),其中(x=>categoryid===u categoryid);除了不仅返回最新的值,还在上下文中更新?