0

我正在用 C# 编写一个简单的代码生成器,用于自动执行业务应用程序中的常见任务,例如数据绑定、模型和视图模型生成以及记录更新。

生成的代码使用一个数据映射器,该映射器通过引用比较(没有 id)实现相等性,并为瞬态状态标记属性(如果对象已创建但未持久化)。

为了更新对象属性,我有 3 个选项:

  • 在属性设置器上,仅立即为一列调用 UPDATE。这将提供即时持久性,而无需最终程序员管理的任何其他机制,但它将需要和不必要的 UPDATE 调用次数

  • 在所有实体上保持冻结状态,这将阻止任何属性集,以及 BeginModification 和 EndModification 方法,这将启用属性设置器并更新 EndModification 上的所有修改列。这需要程序员调用此方法,这对于代码生成器来说是不可取的,因为代码简单和减少程序员干预是其主要目标

  • 为每个实体维护一个计时器(可以实现为全局计时器和本地计数器),并为实体提供一定的“脏时间”,当设置属性时,其脏时间重置为 0 并且当其本地时钟到达时某些值,将进行列更新。这不需要任何外部最终程序员代码,并且可以在单个 UPDATE 上对多个属性集进行分组,因为连续属性集之间的时间几乎为 0。

计时器方法可以与 CommitChanges 方法结合使用,如果需要,该方法将立即调用 UPDATE

我首选的方法是本地脏计时器,因为除了属性集之外零程序员干预的可能性,问题是:这种计时器方法可能会导致数据不一致吗?

4

1 回答 1

1

如果您将其作为教育练习或进一步磨练您的设计技能的手段来编写,那么太好了!如果您写这篇文章是因为您实际上需要一个 ORM,我建议查看许多现有 ORM 中的一个将是一个更明智的主意。这些产品——Entity Framework、NHinbernate 等——已经有人专门维护它们,因此它们提供了比尝试推出自己的 ORM 更可行的选择。

也就是说,我会回避任何自动数据库更新。大多数现有的 ORM 都遵循在实体级别存储状态信息的模式(通常一个实体表示表中的一行,当然,实体可以与其他实体相关联),并且更改由开发人员显式调用函数来提交这样做。这类似于您的计时器方法,但没有...嗯...计时器。如果您正在编写诸如 Winforms 应用程序之类的东西并且用户正在通过数据绑定更新属性,那么自动提交更改可能会很好,但这通常通过使用实用程序类(例如自定义绑定列表实现)来更好地完成检测更改并自动提交。

于 2014-12-14T05:30:29.923 回答