你如何坚持一个树形结构的数据库表使用ADO.NET数据集和一个DataAdapter自动递增的ID

问题描述:

我有一个表示树形结构你如何坚持一个树形结构的数据库表使用ADO.NET数据集和一个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) 

是不是有什么特别的我必须做的就是ID代当我在DataAdapter上调用Update时递归地传播?

我不知道具体ADO.net,但大多数的ORM不会自动插入新记录的ID有关系。你必须诉诸于2个步骤:

  1. 创建和保存父
  2. 构建和关系保存孩子家长

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

+0

如果存在外键约束设置,则在更新父代时,ADO.NET非常智能,可以将父代ID推入数据集中的子代 - 因此,您需要在子代之前保存父代,但不一定保存父代在创建链接的孩子之前。当自引用时不尝试。 – Murph 2008-10-03 12:24:59

这有什么区别,如果你去

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

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