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

Posted

技术标签:

【中文标题】如何使用 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 【发布时间】:2010-09-05 12:54:09 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

    构建并保存父级 建立并保存与父母关系的孩子

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

【讨论】:

ADO.NET 足够聪明,可以在有外键约束集的情况下更新父级时将父级 ID 推送到数据集中的子级中 - 因此您需要在子级之前保存父级,但是在创建链接的子级之前不一定要保存父级。自我引用时未尝试。【参考方案3】:

如果你去有什么不同吗

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

【讨论】:

以上是关于如何使用 ADO.NET DataSet 和 DataAdapter 将树结构持久保存到具有自动递增 ID 的数据库表中的主要内容,如果未能解决你的问题,请参考以下文章

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

在运行时将 ADO.Net DataSet 指向不同的数据库?

(转)Linq-DataSet

ADO.NET的DataSet问题

ado.net的五大对象

ADO.NET_DataSet类,DataAdapter类,DataTable类