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

How do you persist a tree structure to a database table with auto incrementing IDs using an ADO.NET DataSet and a DataAdapter

提问人:Justin Walgran 提问时间:8/8/2008 更新时间:10/1/2008 访问量:1568

问:

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

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

.NET 数据库 ado.net

评论


答:

0赞 lomaxx 8/8/2008 #1

如果你去,有什么区别吗

newRow.SetParentRow(parentRow, RoleTable.Relations("RoleToRole"))
2赞 James A. Rosen 8/24/2008 #2

我不太清楚 ADO.net,但大多数 ORM 不会自动在关系中插入新记录的 ID。您必须求助于两步过程:

  1. 生成并保存父项
  2. 建立和保存与父母关系的孩子

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

评论

0赞 Murph 10/3/2008
如果设置了外键约束,则当父项更新时,ADO.NET 足够智能,可以将父 ID 推送到数据集中的子项中 - 因此,您需要在子项之前保存父项,但不必在创建链接子项之前保存父项。自我参照时未尝试。
0赞 Joe 10/1/2008 #3

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