在ORM上实施记录更新的最佳方法是什么
本文关键字:更新 最佳 是什么 方法 记录 ORM 施记录 | 更新日期: 2023-09-27 18:34:12
我正在用 C# 编写一个简单的代码生成器,用于自动执行业务应用程序上的常见任务,例如数据绑定、模型和视图模型生成以及记录更新。
生成的代码使用数据映射器,该映射器通过引用比较(不带 id(实现相等性,并标记瞬态属性(如果对象已创建但未持久化(。
要更新对象属性,我有 3 个选项:
-
在属性资源库上,仅立即调用一列的 UPDATE。这将提供即时持久性,而无需由最终程序员管理任何其他机制,但它需要和不必要的 UPDATE 调用次数
-
在所有实体上保持冻结状态,这将阻止任何属性集,以及 BeginModification 和 EndModification 方法,这将启用属性设置器并更新 EndModification 上所有已修改的列。这要求程序员调用此方法,这对于代码生成器来说是不可取的,因为代码简单性和减少程序员干预是其主要目标。
-
为每个实体创建一个计时器(可以实现为全局计时器和本地计数器(,并为实体提供一定的"脏时间",当设置属性时,其脏时间重置为 0,当其本地时钟达到特定值时,将进行列 UPDATE。这不需要任何外部最终程序员代码,并且不需要在单个 UPDATE 上对多个属性集进行分组,因为连续属性集之间的时间几乎为 0。
计时器 aproach 可以与 CommitChanges 方法结合使用,如果需要,该方法将立即调用 UPDATE
我更喜欢的方法是本地脏计时器,因为零程序员干预的可能性 除了属性集之外,问题是:这个计时器可能会导致数据不一致吗?
如果你写这篇文章是为了一个教育练习或作为进一步磨练你的设计技能的一种手段,那就太好了!如果你写这篇文章是因为你真的需要一个ORM,我建议看看许多现有的ORM中的一个将是一个更明智的主意。这些产品 - 实体框架,NHinbernate等 - 已经有人专门维护它们,因此它们提供了一个比尝试推出自己的ORM更可行的选择。
也就是说,我会回避任何自动数据库更新。大多数现有的ORM都遵循在实体级别存储状态信息的模式(通常实体表示表中的单个行,尽管实体当然可以与其他实体相关(,并且更改由开发人员显式调用函数提交。这类似于您的计时器方法,但没有...井。。。定时器。如果您正在编写类似 Winforms 应用程序的内容并且用户通过数据绑定更新属性,则最好自动提交更改,但通常最好通过使用实用工具类(如自定义绑定列表实现(来检测更改并自动提交更改。