如何使用ADO.NET DataSet和DataAdapter将自动递增ID的树结构持久化到数据库表

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

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

我正在使用ADO.NET DataTable和DataAdapter来将值加载并保存到此表中。如果我只创建现有行的子项,这将起作用。如果我创建一个子行,然后创建该子项的子项,那么更新,由DataTable生成的临时ID值将进入ParentID列。我有以下数据关系集:

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

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

newRow.SetParentRow(parentRow)

当我在DataAdapter上调用Update时,有什么特别的事情可以让ID生成以递归方式传播?

0

3 答案

如果你去,它有什么区别吗?

newRow.SetParentRow(parentRow, RoleTable.Relations("RoleToRole"))
0
额外

我不特别了解ADO.net,但大多数ORM不会自动在关系中插入新记录的ID。你将不得不采取两个步骤:

  1. 建立并保存父母
  2. 建立并保存与父母关系的子女

这对于ORM来说很困难的原因是因为您可能有循环依赖关系,并且它不知道首先创建ID所需的对象。有些ORM非常聪明,能够找出那些没有这种循环依赖的关系,但大多数不是。

0
额外
如果存在外键约束集,更新父代时ADO.NET足够智能将父代ID推入数据集中的子代 - 因此,您需要将父代保存在子代之前,但不一定在创建之前保存父代相关的孩子。当自引用时不尝试。
额外 作者 Murph,

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

0
额外