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

如何使用ADO.NET数据集和DataAdapter将树结构持久化到具有自动递增ID的数据库表,.net,database,ado.net,.net,Database,Ado.net,我有一个表示树结构的自引用角色表 ID [INT] AUTO INCREMENT Name [VARCHAR] ParentID [INT] 我正在使用ADO.NET DataTable和DataAdapter加载值并将其保存到此表中。如果我只创建现有行的子行,则此操作有效。如果我创建一个子行,然后创建该子行的子行,然后进行更新,则DataTable生成的临时ID值将进入ParentID列。我有以下数据关系集: dataset.Relations.Add(New DataRelation("R

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

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生成递归传播?

如果你这样做会有什么不同吗

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

我不知道ADO.net,但大多数ORM不会自动在关系中插入新记录的ID。您必须采用两步流程:

  • 生成并保存父级
  • 生成并保存与父级具有关系的子级

  • 这对于ORMs来说很困难的原因是,您可能有循环依赖关系,并且它不知道首先需要为哪个对象创建ID。有些ORM足够聪明,可以找出那些不存在循环依赖关系的关系,但大多数ORM都不存在循环依赖关系。

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

    ADO.NET足够智能,可以在更新父项时将父项ID推入数据集中的子项中(如果存在外键约束集),因此您需要在子项之前保存父项,但不必在创建链接子项之前保存父项。自我参照时未尝试。