Gle*_*eno 11 c# entity-framework-4.1
我正在使用一个DbContext场景实例在WPF应用程序中本地隐藏数据库的整个副本.我听说这是不好的做法,但我的数据库很小,我需要在应用程序运行时在本地完整复制它.
一个扩展方法IQueryable,Load()让我预加载一个元素DbSet<>,这样我就可以将东西绑定到Local属性了DbSet<>.数据库中的数据变化很快,所以我想SaveChanges()重新加载所有内容,甚至是已经跟踪过的对象.Load()再次调用该方法不会更新已加载的已跟踪但未标记为已更改的项目.
重新加载预装物品的首选方法是DbSet<>什么?在我的脑海中,我只能想到调用SaveChanges(),然后遍历所有条目并将跟踪和原始值都设置为数据库中的当前值,然后Load()是可能添加的任何新对象.在我的场景中,不可能删除对象,但从长远来看,我可能不得不支持删除项目.这似乎不对,应该有办法放弃一切并重新加载.看起来更容易删除我的上下文并重新开始,但是WPF中的所有元素都已经绑定了Local´ObservableCollection<>,这只是弄乱了界面.
Lad*_*nka 25
这不是您应该使用的方式DbContext,因此几乎不可能重新加载数据.长时间保持单个上下文是不正确的用法.该链接还将回答未跟踪实体未更新的原因.
您可以有选择地重新加载通过调用一个单一的实体Reload上DbEntityEntry:
context.Entry(entity).Reload();
Run Code Online (Sandbox Code Playgroud)
您也可以恢复到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.aspx