我正在使用DbContext
场景的单个实例在WPF应用中本地隐藏数据库的整个副本。我听说这是不好的做法,但我的数据库很小,我需要在应用程序运行时在本地完整复制它。
IQueryable
的扩展方法,Load()
允许我预加载DbSet<>
的元素,以便我可以将事物绑定到DbSet<>
的Local属性。数据库中的数据变化很快,因此我希望SaveChanges()
并重新加载所有内容,甚至是已经跟踪过的对象。再次调用Load()
方法不会更新已加载但未标记为已更改的项目。
在DbSet<>
中重新加载预加载项目的首选方法是什么?在我的脑海中,我只能想到调用SaveChanges()
,然后遍历所有条目并将跟踪和原始值都设置为数据库中的当前值,然后Load()
可能出现的任何新对象已被添加。在我的场景中,不可能删除对象,但从长远来看,我可能不得不支持删除项目。这似乎不对,应该有办法放弃一切并重新加载。看起来更容易删除我的上下文并重新开始,但WPF中的所有元素都已经绑定到Local´ObservableCollection<>
,这只是弄乱了界面。
答案 0 :(得分:25)
这不是您应该使用DbContext
的方式,因此几乎不可能重新加载数据。保持单一环境很长一段时间是incorrect usage。该链接还将回答未跟踪实体未更新的原因。
您可以通过Reload
上的DbEntityEntry
来选择性地重新加载单个实体:
context.Entry(entity).Reload();
您还可以恢复为ObjectContext
并将ObjectQuery
与MergeOption.OverrideChanges
一起使用,或将Refresh
用于RefreshMode.StoreWins
的实体集合。
所有这些方法都存在一些问题:
获取新数据的唯一正确方法是Dispose
上下文,创建一个新的并从头开始加载所有内容 - 无论如何你都在这样做。
答案 1 :(得分:8)
使用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的功能:
答案 2 :(得分:1)
DbContexts应该活得很短, 保存更改后再考虑处理它并从头开始重新加载。 有2组对象..一组来自db,另一组用于绑定。
答案 3 :(得分:0)
请使用()用于CRUD。它会自动重新加载更新的数据。
using (myDbContext context = new myDbContext())
{
}
最诚挚的问候, Thet Tin Oo