实体框架4.1 DbSet重新加载

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,因此几乎不可能重新加载数据.长时间保持单个上下文是不正确的用法.该链接还将回答未跟踪实体未更新的原因.

您可以有选择地重新加载通过调用一个单一的实体ReloadDbEntityEntry:

context.Entry(entity).Reload();
Run Code Online (Sandbox Code Playgroud)

您也可以恢复到ObjectContext和使用ObjectQueryMergeOption.OverrideChanges,或者使用Refresh与实体的集合RefreshMode.StoreWins.

所有这些方法都遇到了一些问题:

  • 如果在数据库中删除该记录,则不会从上下文中删除该记录.
  • 关系的变化并不总是得到更新.

获取新数据的唯一正确方法是Dispose上下文,创建一个新的并从头开始加载所有内容 - 无论如何你正在这样做.


sks*_*kst 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的功能:

http://msdn.microsoft.com/en-us/library/cc716735.aspx

  • 非常感谢,我对整个.本地事情感到非常困惑.每个人和他们的狗告诉我不要出于任何原因使用单个DbContext,但它明确地提供了这个.Local属性用于长期绑定. (4认同)