如何强制entity framework始终从数据库中获取更新的数据?

我正在使用EntityFramework.Extended库来执行批量更新。 唯一的问题是EF没有跟踪由库执行的批量更新。 所以当我再次查询DbContext时,它不会返回更新的实体。

我发现在查询时使用AsNoTracking()方法会禁用跟踪并从数据库获取新的数据。 但是,由于EF不跟踪使用AsNoTracking()查询的实体,因此我无法对查询的数据执行任何更新。

有没有办法强制EF在跟踪更改时获取最新数据?

请尝试刷新一个实体:

 Context.Entry<T>(entity).Reload() 

编辑:为了获得新的数据为实体的集合是值得尝试处理每个请求后的DbContext实例。

我偶然发现了这个问题,同时寻找解决scheme来解决我在更新实体之后导航属性未填充的问题。 每当我尝试从数据库重新加载实体时,它都会从本地存储中获取条目,而不会通过延迟加载来填充导航属性。 我没有破坏上下文并重新创build上下文,而是发现这使得我可以使用代理工作得到新的数据:

 _db.Entry(entity).State = EntityState.Detached; 

它背后的逻辑是 – 我的更新附加了实体,以便跟踪对其的更改。 这将其添加到本地商店。 此后,任何试图用function代理检索实体的尝试都会导致它抓取本地的实体,而不是去数据库并返回一个全新的,具有代理function的实体。 我尝试了上面的重新加载选项,它从数据库刷新对象,但是这不会给你带有延迟加载的代理对象。 我试着做一个Find(id), Where(t => t.Id = id), First(t => t.Id = id) 。 最后,我检查了提供的状态,看到“分离”状态。 find了! 希望这有助于某人。

使代码在相同的上下文中运行将不会产生更新的实体。 它只会追加运行之间在数据库中创build的新实体。 EF强制重装可以这样完成:

 ObjectQuery _query = Entity.MyEntity; _query.MergeOption = MergeOption.OverwriteChanges; var myEntity = _query.Where(x => x.Id > 0).ToList(); 

我将实体variables声明为类的一部分,而没有赋值。 这使我可以在不丢失variables的情况下处置一个实例,以供其他方法参考。 我只是碰到这个,所以它没有很多的运行时间,但目前为止,似乎工作正常。

 public partial class frmMyForm { private My_Entities db; public frmMyForm() { InitializeComponent(); } private void SomeControl_Click(object sender, EventArgs e) { db.SaveChanges(); db.Dispose(); db = new My_Entities(); ... More Code using db ... }