【问题标题】:Entity Framework for multi-form winforms desktop app用于多表单 winforms 桌面应用程序的实体框架
【发布时间】:2015-11-18 23:16:35
【问题描述】:

我正在开发基于 winforms 和 EF 的桌面应用程序。

目前我在 EF 和架构方面遇到了一些问题:

  1. 同步数据。有多个表单,每个表单都使用它自己的数据库上下文实例。当在一个表单上更新数据时,我需要在其他表单上手动更新它。有很多不灵活的回调和复制粘贴来刷新数据。

  2. 有一些计算在客户端运行并更新大量记录。有时用户需要保存它,而使用 EF 需要很长时间。因此,它也在单独的上下文中运行,因此不会阻止与其他实体的工作

  3. DataGridView 带有绑定实体,DbSet<T>.LocalDbSet<T>.ToList() 存在烦人的问题。保存gridview中的数据时,有时在其他地方没有更新。

我正在寻找可以在那里使用的任何最佳实践和灵活模式。另外,期待听到解决相同问题的人的意见。

谢谢

【问题讨论】:

  • 请记住,您应该为每个操作创建一个新的 DbContext 实例:不要让它们与 UI 元素一起打开。 EF 是围绕工作单元模式设计的。
  • 每个帖子一个问题!并显示您遇到问题的代码。我们无法对诸如“大量非灵活回调”、“有时未更新”等模糊描述做任何事情。
  • @HighCore 我认为 WPF 或 MVVM 并不能真正解决问题中提到的任何问题(不同上下文之间的同步、绑定到本地集、在更新大量记录时阻塞长时间运行的任务等.).

标签: winforms entity-framework design-patterns architectural-patterns


【解决方案1】:

这是我过去所做的(绝不是“最佳实践”,但它对我有用,所以就这样吧):

  1. 使用一种“访客模式”。有一个类,您的表单(或演示者,或您使用的任何模式)订阅表明他们希望收到更改通知。然后在您的SaveChanges() 上,您可以使用ChangeSet 并通知那些请求它的各方。我已经通过表单/演示者仅订阅某些类型的更改来优化这一点,并且我将它分批提供给他们。每个表单对这些数据做任何他们想做的事情(从存储中刷新当前实体,检查显示在网格上的实体等)。

    另外,我在每条记录上都有一个 DateTime 成员(在 SaveChanges 上自动填充)和一个特殊表,其中包含每个主要可编辑记录集合的记录(全局思考, "Customers", "Invoices", etc.) 其中有一个 DateTime 表示上次更新这些记录的时间。如果需要,我可以使用计时器进行轮询(我将其用于应用间通信,而不是用于当前应用内的表单之间的通信)。

  2. 根据您的需要,对线程进行所有更改可能对您有用。如果您的计算确实需要很长时间(或设置并发检查 @987654328 @) 以便用户无法保存正在该线程上修改的记录,但话又说回来,这取决于您的 UI/UX 偏好或要求。

  3. 我不直接绑定到DbSet(更不用说Local,如果您正在使用多个上下文),我有一个绑定到的集合。 “数据在其他地方没有更新”应该通过第1点解决

再说一次,我并不是说这是“最佳”或“推荐”的方式,但我已经使用过它,而且对我来说,它工作得很好。您的里程可能会有所不同。

PS:不是官方的或任何东西,但此链接可能是管理DbContext 生命周期的有趣读物(这可能与原始问题有点不同):http://mehdi.me/ambient-dbcontext-in-ef6/(免责声明:我不要用他的“dbcontextscopes”,直接点这个链接看文字,不知道他的代码好不好)

【讨论】:

    猜你喜欢
    • 2013-08-18
    • 2010-09-14
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    相关资源
    最近更新 更多