2011-04-27 137 views
10

我正在使用单个实例DbContext方案在WPF应用程序中本地隐藏数据库的整个副本。我听说这是不好的做法,但我的数据库很小,在应用程序运行时我需要在本地完整拷贝它。实体框架4.1 DbSet重新加载

IQueryable扩展方法,Load()让我预加载DbSet<>的元素,让我可以绑定事情的DbSet<>的本地属性。数据库中的数据变化很快,所以我想SaveChanges()并重新加载的一切,甚至已经跟踪的对象。再次调用Load()方法不会更新已被加载但被标记为未更改的项目。

DbSet<>中重装预装物品的首选方法是什么?关于我的头顶,我只能想到调用SaveChanges(),然后遍历所有条目并将跟踪值和原始值都设置为数据库中的当前值,然后将Load()设置为可能已添加的任何新对象。在我的场景中,不可能删除对象,但我可能必须在长期运行中支持项目删除。这看起来不正确,应该有办法放弃一切并重新加载。看起来,放弃我的上下文并重新开始更容易,但WPF中的所有元素都已绑定到Local´ObservableCollection<>,这只会弄乱界面。

回答

24

这不是你应该使用DbContext的方式,因为这几乎不可能重新加载数据。长期保持单一背景是incorrect usage。该链接还将回答为什么您的跟踪实体未更新。

您可以选择通过调用DbEntityEntryReload重装一个单一的实体:

context.Entry(entity).Reload(); 

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

所有这些方法受到一些问题:

  • 如果记录在数据库中删除,也不会被从上下文中删除。
  • 关系的变化并不总是被刷新。

获取最新数据的唯一正确方法是上下文创建一个新的数据并从头开始载入所有内容 - 无论如何您都要这样做。

+0

谢谢你的回复,虽然我有些失落,因为我已经读到,在我的情况下,我的选择恰恰相反。我会回顾这些话题,然后回来。 – Gleno 2011-04-27 19:42:52

+0

我的关系没有变化,数据库中也没有删除。我将在今天晚些时候开始另一个问题,并试图解释为什么我不能有一个短暂的DbContext。我真的希望你能够接受一些有价值的投入。 – Gleno 2011-05-09 10:19:11

1

DbContexts应该短时间, 考虑保存更改后处理它并重新加载所有从一开始。 有两组对象,一组来自数据库,另一组来自绑定。

+5

我真的不能这样做,因为那样的话,我会在进度失去UI状态。我真的希望我能有一个短暂的DbContext,但我不明白在我的情况下可能如何。 – Gleno 2011-05-09 10:16:35

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

+4

非常感谢,我对整个。地方的事情感到非常困惑。每个人和他们的狗都告诉我不要因为任何原因使用单个DbContext,但它明确提供了这个.Local属性来进行长期绑定。 – Gleno 2011-06-30 17:08:06

+1

@Gleno我完全同意你的观点,恕我直言,大多数人都使用这种方式来处理上下文短暂的ASP,但对于桌面应用程序来说,重新加载你输入新表单的所有内容都是无稽之谈,特别是如果信息通过各种形式你的应用。 – Hannish 2013-09-27 12:37:22

0

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

using (myDbContext context = new myDbContext()) 
{ 

} 

最好的问候, 忒提斯丁吴