如何使用ADO.NET数据集和数据适配器将树结构持久化到具有自动递增ID的数据库表中

时间:2020-03-05 18:38:28  来源:igfitidea点击:

我有一个自我引用的角色表,代表一个树结构

ID [INT] AUTO INCREMENT
Name [VARCHAR]
ParentID [INT]

我正在使用ADO.NET DataTable和DataAdapter加载并将值保存到该表。如果仅创建现有行的子级,则此方法有效。如果我要创建一个子行,然后再创建一个子行,然后执行Update,则DataTable生成的临时ID值将进入ParentID列。我设置了以下数据关系:

dataset.Relations.Add(New DataRelation("RoleToRole",RoleTable.Columns("ID"), RoleTable.Columns("ParentID")))

当我在DataTable中创建新的子行时,我调用SetParentRow方法

newRow.SetParentRow(parentRow)

在DataAdapter上调用Update时,我需要做些特殊的事情来使ID生成以递归方式传播吗?

解决方案

回答

你去有什么区别吗

newRow.SetParentRow(parentRow, RoleTable.Relations("RoleToRole"))

回答

我并不特别了解ADO.net,但是大多数ORM不会自动在关系中插入新记录的ID。我们必须采用两步过程:

  • 建立并保存父项
  • 建立并保存与父母有关系的孩子

对于ORM而言,这很困难,原因是我们可能具有循环依赖关系,并且它不知道首先需要创建哪个ID的对象。一些ORM足够聪明,可以找出没有这种循环依赖关系的关系,但大多数不是。

回答

我建议我们添加一个ForeignKeyConstraint,并将UpdateRule设置为Cascade。