Entity Framework 4.1 DbSet Reload
本文关键字:DbSet Reload Framework Entity | 更新日期: 2023-09-27 17:53:45
我使用DbContext
场景的单个实例在WPF应用程序中本地阴影数据库的整个副本。我听说这是不好的做法,但我的数据库很小,我需要在应用程序运行时在本地复制整个副本。
IQueryable
, Load()
的扩展方法让我可以预加载DbSet<>
的元素,这样我就可以将东西绑定到DbSet<>
的Local属性。数据库中的数据变化很快,所以我想SaveChanges()
并重新加载所有,甚至是已经跟踪的对象。再次调用Load()
方法不会更新被跟踪但未标记为更改的项目,这些项目已经加载。
在DbSet<>
中重新加载预加载项的首选方法是什么?在我的脑海中,我只能想到调用SaveChanges()
,然后遍历所有条目并将跟踪值和原始值设置为数据库中的当前值,然后将Load()
设置为可能添加的任何新对象。在我的场景中,不可能删除对象,但从长远来看,我可能不得不支持条目删除。这似乎是不对的,应该有一种方法可以放下所有东西并重新加载。这似乎是更容易放弃我的上下文,只是重新开始,但所有的元素在WPF已经绑定到Local´ObservableCollection<>
,这只是搞砸了接口。
这不是您应该使用DbContext
的方式,因此几乎不可能重新加载数据。长时间保持一个上下文是不正确的用法。该链接还将回答为什么您跟踪的实体没有更新。
你可以通过在DbEntityEntry
上调用Reload
来选择性地重新加载一个实体:
context.Entry(entity).Reload();
您也可以恢复到ObjectContext
并将ObjectQuery
与MergeOption.OverrideChanges
一起使用,或者将Refresh
用于RefreshMode.StoreWins
的实体集合。
所有这些方法都存在一些问题:
- 如果记录在数据库中被删除,它将不会从上下文中删除。
- 关系的更改并不总是刷新。
获取新数据的唯一正确方法是Dispose
上下文,创建一个新上下文并从头加载所有内容-无论如何,您都在这样做
在Entity Framework 4.1中,WPF数据绑定的建议已更改为使用. local和持久DbContext。
http://blogs.msdn.com/b/efdesign/archive/2010/09/08/data-binding-with-dbcontext.aspx当然,你可以在需要的时候处理它,但如果你这样做,它会对UI产生负面影响。
这是另一种方法,但我不确定它是否考虑了EF4.1的功能:
http://msdn.microsoft.com/en-us/library/cc716735.aspxdbcontext应该存在很短的时间,考虑在保存更改之后,处理它并从头重新加载所有更改。有两套物品…一个来自db,一个用于绑定。
请使用using()进行CRUD。它将自动重新加载更新后的数据。
using (myDbContext context = new myDbContext())
{
}
最诚挚的问候,