entity framework4.1 DbSet重新加载

我正在使用单个DbContext场景实例在WPF应用程序中本地DbContext数据库的整个副本。 我听说这是不好的做法,但我的数据库很小,我需要在应用程序运行时在本地完整复制它。

IQueryable的扩展方法, Load()允许我预加载DbSet的元素,这样我就可以将东西绑定到DbSet的Local属性。 数据库中的数据变化很快,因此我想要SaveChanges()并重新加载所有内容 ,甚至是已经跟踪过的对象。 再次调用Load()方法不会更新已加载的已跟踪但未标记为已更改的项目。

DbSet中重新加载预加载项的首选方法是什么? 在我的脑海中,我只能想到调用SaveChanges() ,然后遍历所有条目并将跟踪和原始值都设置为数据库中的当前值,然后Load()可能已添加的任何新对象。 在我的场景中,不可能删除对象,但从长远来看,我可能不得不支持删除项目。 这似乎不对,应该有办法放弃一切并重新加载。 看起来更容易丢弃我的上下文并重新开始,但WPF中的所有元素已经绑定到Local´ObservableCollection ,这只是弄乱了界面。

这不是您应该使用DbContext的方式,因此几乎不可能重新加载数据。 长时间保持单个上下文是不正确的用法 。 该链接还将回答未跟踪实体未更新的原因。

您可以通过在DbEntityEntry上调用Reload来有选择地重新加载单个实体:

 context.Entry(entity).Reload(); 

您还可以恢复为ObjectContext并将ObjectQueryMergeOption.OverrideChanges使用,或者将Refresh用于具有RefreshMode.StoreWins的实体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的function:

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

DbContexts应该是短时间的,考虑保存更改后处理它并从头开始重新加载。 有2组对象..一个来自db,另一个来自绑定。

请使用()用于CRUD。它将自动重新加载更新的数据。

 using (myDbContext context = new myDbContext()) { } 

最诚挚的问候,Thet Tin Oo