Windows / WPF / Silverlight应用程序中的实体框架ObjectContext

时间:2009-12-22 20:44:41

标签: .net wpf entity-framework wcf-ria-services

我们正在使用Entity框架编写WPF应用程序(准确地说,Silverlight与RIA服务)。我们通过应用程序使用共享的ObjectContext,这样我们就可以从跨模块共享数据中受益。

问题是 - 如果用户在工作期间打开让我们说历史销售,它会被加载到ObjectContext并保持到应用程序结束。所以应该使用另一种模式。

我知道ObjectContexts应该用作单个工作单元。但是,您如何让应用程序的其他部分知道某些内容已发生变化并且应该重新加载数据?

编辑:好的,EventAggregator,但是,这将导致所有其他部分重新加载他们的(可能大部分重复)数据。所有类型的参与团体也可能需要许多活动。

你如何解决这些问题?我当前的解决方案是一种妥协 - 使用共享的ObjectContext作为整个应用程序使用的核心数据,以便它们可以自动共享和更新。对于大量数据,请使用新的单独ObjectContext。有更好的想法吗?

有没有办法如何从DataContext中“释放”实体,以便垃圾收集器可以完成其工作并释放内存?

4 个答案:

答案 0 :(得分:2)

等等,是WPF还是Silverlight?在这种情况下,它们是非常不同的,我的答案会有所不同。

WPF解决方案

在WPF中,我会为每个表单创建一个ObjectContext 。这样,上下文只会持续与表单本身一样长。然后,您应该实现一个事件系统,这样当您将更改保存到实体时,您可以提醒他们刷新其数据所需的其他表单(例如INotifyPropertyChanged)。 Oren Eini wrote a pretty good article on this architecture using NHibernate in MSDN magazine。您应该能够从他的文章中获得架构概念。

Silverlight解决方案

现在,Silverlight与众不同。 Silverlight基本上只允许您在应用程序中使用一个表单。是的,您可以使用一些技巧将表单的根视觉导航到不同的“页面”,但它仍然只是一种形式,用户无法在一个Silverlight RIA中打开多个窗口。因此,我会根据Silverlight RIA实例制作一个.Net RIA Services ObjectContext 。请记住,RIA Services不是与数据库的实际连接,它只是链接到Web服务的缓存和更改跟踪对象。因此,将此对象保留较长时间是完全可以接受的,因为它不会占用任何服务器资源。如果您的Silverlight RIA打开多个浏览器窗口或具有多个Silverlight对象,那么每个Silverlight实例应该有一个ObjectContext。

在服务器上,您在Web服务中使用实体框架ObjectContext,它应该只在一个请求期间生效。您可以提供服务的无国籍人越多,他们的可扩展性和性能就越高。您想要打开EF ObjectContext,使用它,并尽快关闭它。


编辑:

如果你想要做的只是从对象上下文中分离一个对象,那么你可以使用context.Detach(entity)方法。您可以找到example of how to do this on MSDN

答案 1 :(得分:1)

您可以使用存储库模式。 UI和DAL之间的另一个抽象层。

使存储库中的数据集合静态且可观察。然后每当存储库更新其中的任何一个时,UI层应该赶上。 JUst一个想法。

答案 2 :(得分:0)

在ObjectContext中使用ObservableCollections。使用在NotifyPropertyChange上触发的事件。在视图模型之间使用发布/订阅模式以通知它们更改并使用它来更新其他视图。

答案 3 :(得分:0)

在我们的例子中,我们决定实现工厂模式并在需要时实例化一个新的对象上下文(有时它不会将一对一映射到VM)。

关于对象上下文生命时间的Agreat文章: http://www.silverlightshow.net/items/Silverlight-WCF-RIA-Services-strategies-for-handling-your-Domain-Context-part-one.aspx