实体框架4.1 DbSet重新加载

时间:2011-04-27 05:26:05

标签: c# entity-framework-4.1

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

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

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

4 个答案:

答案 0 :(得分:25)

这不是您应该使用DbContext的方式,因此几乎不可能重新加载数据。保持单一环境很长一段时间是incorrect usage。该链接还将回答未跟踪实体未更新的原因。

您可以通过Reload上的DbEntityEntry来选择性地重新加载单个实体:

context.Entry(entity).Reload();

您还可以恢复为ObjectContext并将ObjectQueryMergeOption.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的功能:

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

答案 2 :(得分:1)

DbContexts应该活得很短, 保存更改后再考虑处理它并从头开始重新加载。 有2组对象..一组来自db,另一组用于绑定。

答案 3 :(得分:0)

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

using (myDbContext context = new myDbContext())
{

}

最诚挚的问候, Thet Tin Oo