gpt4 book ai didi

c# - 如何通过同步实现 C# Winforms 数据库应用程序?

转载 作者:搜寻专家 更新时间:2023-10-30 20:38:23 25 4
gpt4 key购买 nike

背景

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

要求

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

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

我该如何实现?

建议的解决方案

我可以使用 Microsoft Entity Framework 创建数据库以及数据库和代码之间的链接。这将节省大量手动工作,因为有数百个属性。我是这项技术的新手,但已经在其中完成了一个“hello world”项目。

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

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

有人能预见到这样做的任何障碍吗?我是否最好使用推荐的数据同步解决方案之一,如果是这样,这些解决方案是否可以与 Entity Framework 一起使用?

最佳答案

在关系数据库之间同步数据是一件痛苦的事情。您最好的行动方案可能取决于:会有多少用户?冲突的可能性有多大(即用户将在同一数据上离线工作)。也可能您有什么样的人力(您是否有适当的 DBA/Sql Server 开发人员随时待命以协助 SQL 部分,或者您只是 .NET 开发人员)。

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

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

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

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

关于c# - 如何通过同步实现 C# Winforms 数据库应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31112844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com