0

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

目前我对 EF 和架构有一些问题:

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

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

  3. 有带有绑定实体的 DataGridViews 并且有 和 有烦人的DbSet<T>.Local问题DbSet<T>.ToList()。当gridview中的数据被保存时,它有时不会在其他地方更新。

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

谢谢

4

1 回答 1

0

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

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

    此外,我在每条记录DateTime上都有一个成员(在上次更新这些记录的时间。如果需要,我可以使用计时器进行轮询(我将其用于应用程序间通信,而不是用于当前应用程序内的表单之间的通信)。SaveChangesDateTime

  2. 根据您的需要,对线程进行所有更改可能对您有用。如果您的计算确实需要很长时间(或设置并发检查),您可能需要设置软锁(您可以在应用程序中控制它们、禁用Save按钮或网格的可编辑性等SaveChanges),以便用户无法保存正在该线程上修改的记录,但话又说回来,这取决于您的 UI/UX 偏好或要求。

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

同样,我并不是说这是“最好的”或“推荐的”方式,但我已经使用过它,而且对我来说,它工作得很好。你的旅费可能会改变。

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

于 2015-08-25T10:15:08.197 回答