Entity Framework 4.1 DbSet Reload

本文关键字:DbSet Reload Framework Entity | 更新日期: 2023-09-27 17:53:45

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

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

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

Entity Framework 4.1 DbSet Reload

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

你可以通过在DbEntityEntry上调用Reload来选择性地重新加载一个实体:

context.Entry(entity).Reload();

您也可以恢复到ObjectContext并将ObjectQueryMergeOption.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

dbcontext应该存在很短的时间,考虑在保存更改之后,处理它并从头重新加载所有更改。有两套物品…一个来自db,一个用于绑定。

请使用using()进行CRUD。它将自动重新加载更新后的数据。

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

最诚挚的问候,