【问题标题】:What is the best way to implement record updates on an ORM? [closed]在 ORM 上实现记录更新的最佳方法是什么? [关闭]
【发布时间】:2014-12-14 05:19:47
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

  • 我不完全理解你的计时器想法。为什么计时器甚至是必要的?
  • Imo,如果您可以使用 Microsoft Sql Server,那么结合 PetaPoco 的 Visual Studio SQL 数据库项目是您可以使用当今技术构建的最佳系统,而无需重新发明任何轮子。 Visual Studio 中的数据库项目让您可以 100% 控制 SQL 的“表/存储过程”等,它使您能够轻松地部署它并为您处理架构更新/合并。 peta poco 可能是您可以使用的最快(微量)。我们使用这种方法和 petapoco 的 TT 模板来生成我们的 pocos。
  • 计时器用于消除对 CommitChanges 方法的需求,现在我明白这是一个坏主意,必须明确进行数据更改。生成的代码已经与 Entity Framework 和 SqlServer .net api 一起工作,并支持数据库模式模型(仅限表和存储过程)。因为目标是生成多平台和多 RDBMS 代码,我们决定创建自己的简单但功能强大的 ORM,以便在所有这些上使用相似的数据层

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


【解决方案1】:

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

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

【讨论】:

  • 谢谢!,然后就是显式提交了。
猜你喜欢
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 2019-08-28
相关资源
最近更新 更多