giu*_*ius 5 .net wpf entity-framework wcf-ria-services
我们正在使用Entity框架编写WPF应用程序(准确地说,Silverlight与RIA服务).我们通过应用程序使用共享的ObjectContext,这样我们就可以从跨模块共享数据中受益.
问题是 - 如果用户在工作期间打开让我们说历史销售,它会被加载到ObjectContext并保持到应用程序结束.所以应该使用另一种模式.
我知道ObjectContexts应该用作单个工作单元.但是,您如何让应用程序的其他部分知道某些内容已发生变化并且应该重新加载数据?
编辑:好的,EventAggregator,但是,这将导致所有其他部分重新加载他们的(可能大部分重复)数据.也许所有类型的参与团体都需要许多活动.
你是如何解决这些问题的?我当前的解决方案是一种妥协 - 使用共享的ObjectContext作为整个应用程序使用的核心数据,以便它们可以自动共享和更新.对于大量数据,请使用新的单独ObjectContext.有更好的想法吗?
有没有办法如何从DataContext中"释放"实体,以便垃圾收集器可以完成其工作并释放内存?
等等,是 WPF 还是 Silverlight?在这种情况下,它们非常不同,我的答案也会不同。
WPF解决方案
在 WPF 中,我将为每个表单创建一个 ObjectContext。这样,上下文的持续时间就与表单本身一样长。然后,您应该实现一个事件系统,以便当您保存对实体的更改时,您可以提醒其他表单它们可能需要刷新其数据(例如 INotifyPropertyChanged )。Oren Eini 在 MSDN 杂志上写了一篇关于使用 NHibernate 架构的非常好的文章。你应该能够从他的文章中获得架构概念。
银光解决方案
现在,Silverlight 不同了。Silverlight 本质上只允许您的应用程序中有一种表单。是的,您可以使用一些技巧将表单的根视觉导航到不同的“页面”,但它仍然只是一种表单,并且用户无法在一个 Silverlight RIA 中打开多个窗口。因此,我将为每个 Silverlight RIA 实例创建一个 .Net RIA Services ObjectContext。请记住,RIA 服务并不是与数据库的实际连接,它只是链接到 Web 服务的缓存和更改跟踪对象。因此,让该对象存在较长时间是完全可以接受的,因为它不会占用任何服务器资源。如果您的 Silverlight RIA 打开多个浏览器窗口或具有多个 Silverlight 对象,则每个 Silverlight 实例都应该有一个 ObjectContext。
在服务器上,您在 Web 服务中使用实体框架 ObjectContext,它应该仅在一个请求的持续时间内存在。您的服务越无状态,它们的可扩展性和性能就越高。您希望尽快打开 EF ObjectContext、使用它并关闭它。
编辑:
如果您只想将对象从对象上下文中分离出来,那么您可以使用该context.Detach(entity)方法。您可以在 MSDN 上找到如何执行此操作的示例。
| 归档时间: |
|
| 查看次数: |
3997 次 |
| 最近记录: |