如何强制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 ... }
- 在ASP.NET MVC中实现configuration文件提供程序
- 如何显示DisplayAttribute.Description属性值?
- EntityType'Category'没有定义键。 定义这个EntityType的关键
- 在新的ASP.NET MVC 5项目中更新NuGet包引用之后,如何修复与JSON.NET的程序集版本冲突?
- Html5的占位符与.NET MVC 3razorEditorFor扩展?
- 红隼和武士刀之间的区别
- System.Runtime.Caching.MemoryCache vs HttpRuntime.Cache – 有什么区别吗?
- 无法加载文件或程序集HRESULT:0x80131515(将控制器添加到在networking驱动器上具有程序集引用的MVC项目时)
- 以强types的方式获取属性的属性