Entity framework 为什么Entity Framework总是从数据库中获取最新版本的数据,但如果对象已经存在于上下文中,就不使用它?
有人能给我解释一下EntityFramework6缓存的工作方式吗?这对我来说毫无意义 正如我所读到的(并且有经验),Ef将始终查询数据库-但是如果上下文中已经存在数据,那么它将使用旧数据。你为什么要那样做?当然,这只是创建了不必要的数据库读取。如果要获取数据,为什么不总是使用最新版本 从数据库返回结果时,上下文中不存在的对象将附加到上下文。如果一个对象已经在上下文中,则返回现有对象(条目中对象属性的当前值和原始值不会被数据库值覆盖) 有没有办法让EF6在进行这些查询时更新其上下文 编辑: 刷新上下文对我来说不是解决方案的原因是,为了一个小查询,需要运行几个其他查询。基本上,上下文用于获取数千条记录。数据可能会在后台更改,因为我有其他操作在不同的上下文中异步运行 我有一些解决方法,我只是想理解为什么没有一个简单的选项可以使用后续Where查询中检索到的信息更新上下文中的数据 进行此操作:Entity framework 为什么Entity Framework总是从数据库中获取最新版本的数据,但如果对象已经存在于上下文中,就不使用它?,entity-framework,Entity Framework,有人能给我解释一下EntityFramework6缓存的工作方式吗?这对我来说毫无意义 正如我所读到的(并且有经验),Ef将始终查询数据库-但是如果上下文中已经存在数据,那么它将使用旧数据。你为什么要那样做?当然,这只是创建了不必要的数据库读取。如果要获取数据,为什么不总是使用最新版本 从数据库返回结果时,上下文中不存在的对象将附加到上下文。如果一个对象已经在上下文中,则返回现有对象(条目中对象属性的当前值和原始值不会被数据库值覆盖) 有没有办法让EF6在进行这些查询时更新其上下文 编辑: 刷
_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的最新值(“新描述”),但它将完全忽略它,只从原始上下文返回值
你可以:
_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);除了不仅返回最新的值,还在上下文中更新?