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

时间:2008-08-07 20:23:51

标签: .net database ado.net

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

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

3 个答案:

答案 0 :(得分:1)

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

  1. 构建并保存父级
  2. 建立并保存与父母有关系的孩子
  3. 对于ORM来说这很困难的原因是因为您可能具有循环依赖关系,并且它不知道首先创建ID所需的对象。一些ORM足够聪明,可以找出那些没有这种循环依赖关系的关系,但大多数都没有。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果你去

会有什么不同吗?
newRow.SetParentRow(parentRow, RoleTable.Relations("RoleToRole"))