如何实现具有同步功能的 C# Winforms 数据库应用程序

本文关键字:功能 Winforms 应用程序 数据库 同步 何实现 实现 | 更新日期: 2023-09-27 18:00:12

Background

我正在开发一个 C# winforms 应用程序 - 目前高达 11000 LOC 并且 UI 和逻辑已完成约 75%,但还没有持久性。 表单上有数百个属性。 有 23 个实体/数据类。

要求

数据需要保存在 SQL 数据库中。 大多数用户远程操作,我们不能依赖他们建立连接,因此我们需要一个在本地维护数据库并将其与中央数据库保持同步的解决方案。

编辑:大多数远程用户只需要其本地副本中的数据库子集。 这是因为如果他们没有访问权限(在我的应用程序中定义和存储(来查看其他用户的记录,则他们在同步期间不会收到这些记录的副本。

我该如何实现?

建议的解决方案

我可以使用Microsoft实体框架来创建数据库以及数据库和代码之间的链接。 这将节省大量的手动工作,因为有数百个属性。 我是这项技术的新手,但在其中做了一个"hello world"项目。

对于数据同步,每个实体都有一个整数主键 ID。 此外,它还将具有与中央数据库相关的辅助 ID 列。 此辅助列将在中央数据库中包含 null,但将填充在本地数据库中。

对于同步,我会编写复制记录并相应地分配 ID 的代码。 我需要处理冲突。

谁能预见到这样做的任何绊脚石? 我是否最好使用推荐的数据同步解决方案之一,如果是这样,这些解决方案是否适用于实体框架?

如何实现具有同步功能的 C# Winforms 数据库应用程序

在关系数据库之间同步数据很痛苦。您的最佳行动方案可能取决于:将有多少用户?冲突的可能性(即用户将脱机处理相同的数据(。也可能你有什么样的人力(你有合适的DBA/SQL Server开发人员随时协助SQL部分,或者你只是.NET开发人员(。

我不羡慕你这个任务,它闻起来很麻烦。我特别担心数据损坏并将这种损坏迅速传播到所有客户端。在远程数据库中的任何数据更新之前,我会采取极端的对策。

如果您预测很多冲突 - 同一数据块被多个用户多次修改 - 我可能至少会考虑创建一个额外的"合并"层来弄清楚在远程数据库上执行的正确操作顺序是什么。

一个想法 - 这可能是非常错误和疯狂的,但只是我脑海中浮现的事情 - 是在实体上使用JSON Patch,无论是实际的域对象还是某些配置容器。用户所做的所有更改都记录为 JSON Patch 语句,然后应用于本地数据库,当用户在线时 - 提交 - 带有时间戳!- 合并提供程序。来自不同客户端的 JSON Patch 语句可以按实体 ID 分组并按时间戳排序,用户可以获得有关来自不同用户的其他操作排队的反馈 - 并手动对其进行修正。这些分组语句甚至可以存储在 git 存储库中的文件中。然后,以某些预定义的时间间隔或手动触发,将在服务器端应用程序上执行更新并保存到远程数据库。在此之后,用户的本地副本将从服务器刷新。

这只是一个粗略的想法,但我认为你需要一些具有类似功能的东西 - 它不一定是 JSON Patch + Git,你可以用数百种方式做到这一点。不过,我不认为您只需通过本地/远程数据库并进行更新/合并即可侥幸逃脱。想象一下这样的场景:用户离线更新一些数据(假设 20 个字段(,另一个用户对 20 个字段进行完全不同的更新,其中 10 个在用户之间是通用的。现在,同步过程应该做什么?先应用后再后更改?我相当确定两个用户都会很生气,因为他们的输入是"原子的"——要么一切都改变了,要么什么都没有。后一个"提交"必须被拒绝,或者用户应该可以选择修改新数据。这在很大程度上取决于你的数据是什么,正如我所说 - 用户的数量/行为是多少。呃,甚至时区在这里也变得很重要 - 如果你的用户都在一个时区,你可能会在一天中系统同步时有预定义的时间 - 但你无法说服具有许多不同工作时间的人"同步会话"将发生在例如上午 11 点,当他们通常向管理层或 sth ;)