【发布时间】: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