您有两个不同的问题:
- 如何缓存更新?
- 如何同时提交相关表的更新。
缓存更新可以通过多种方式实现,最佳方式取决于您的具体情况:
ADO批量更新
由于您已经声明正在使用ADO访问数据,因此这是一个合理的选择。您只需要在打开数据集之前将LockType设置为ltBatchOptimistic并将CursorType设置为ctKeySet或ctStatic。然后在准备提交时调用TADOCustomDataset.UpdateBatch。
注意:底层OLEDB提供程序必须支持批量更新才能利用此功能。SQL Server提供程序完全支持此功能。
我不知道在持久化数据时强制执行主/细节关系的其他方法,除了在两个数据集上顺序调用UpdateBatch。
Parent.UpdateBatch;
Child.UpdateBatch;
客户端数据集
数据缓存是TClientDataset
存在的主要原因之一,同步主/从关系并不困难。
为了实现这一点,您像往常一样在两个数据集组件上定义主/从关系(在您的情况下是ADOQuery
或ADOTable
)。然后创建一个单一的提供程序并将其连接到主数据集。将一个单一的TClientDataset
连接到提供程序,就完成了。 TClientDatset
将详细数据集解释为嵌套数据集字段,可以像任何其他数据集一样访问和绑定到数据感知控件。
一旦完成此操作,只需调用TClientDataset.ApplyUpdates
,客户端数据集将负责正确排序主/从数据的更新。
ORMs
关于ORMs有很多可以说的内容。太多了,无法放入StackOverflow的答案中,所以我会尽量简短。
最近ORMs受到了一些批评,有些评论家甚至认为它们是反模式。个人认为这有点不公平。对象关系映射是一个非常难以正确解决的问题。ORMs试图通过抽象化在关系表和对象实例之间传输数据的复杂性来帮助解决这个问题。但像软件开发中的其他一切一样,没有银弹,ORMs也不例外。
对于一个没有太多业务规则的简单数据输入应用程序,ORM可能过度了。但随着应用程序变得越来越复杂,ORM开始变得更加吸引人。
在大多数情况下,您将希望使用第三方ORM而不是自己编写。编写一个完全符合您要求的自定义ORM听起来很不错,而且从简单映射开始很容易入手,但很快就会遇到像父/子关系、继承、缓存和缓存失效等问题(相信我,我有经验)。第三方ORM已经遇到了这些问题,并花费了大量资源来解决它们。
对于许多ORM来说,您交换了代码复杂性以获得配置复杂性。它们中的大多数正在积极努力通过转向惯例和策略来减少样板配置。如果您将所有主键命名为Id
,而不是为每个类映射每个表的Id
列到相应的Id
属性,您只需告诉ORM有关此约定,它就会假定它了解的所有表和类都遵循这个约定。您只需要针对不适用该约定的特定情况覆盖约定。我不熟悉Delphi中的所有ORM,因此无法说哪些支持这一点,哪些不支持。
无论如何,您都希望设计应用程序架构,以便尽可能地推迟使用哪个ORM框架(或任何框架)的决定。