在ORM上实现记录更新的最佳方法是什么?

时间:2014-12-14 05:19:47

标签: c# database orm data-integrity data-persistence

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

生成的代码使用数据映射器,该数据映射器通过引用比较(无id)实现equallity,并使用临时状态的标志属性(如果对象已创建但未持久化)。

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

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

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

  • Mantain为每个实体设置一个计时器(可以实现为全局计时器和本地计数器),并给出一定的"脏时间"对于实体,当设置属性时,其脏时间被重置为0,并且当其本地时钟达到某个值时,将进行UPDATE列。这不需要任何外部最终程序员代码,并且在单个UPDATE上组合几个属性集,因为contiguos属性集之间几乎有0个时间。

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

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

1 个答案:

答案 0 :(得分:1)

如果您将此作为教育练习或作为进一步磨练您的设计技巧的手段,那么太棒了!如果您正在写这篇文章是因为您确实需要ORM,我建议您查看现有的ORM中的一个是一个更明智的想法。这些产品 - 实体框架,NHinbernate等 - 已经有人致力于维护它们,因此它们提供了比尝试推出自己的ORM更可行的选择。

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