你如何坚持一个树形结构的数据库表使用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个步骤:
- 创建和保存父
- 构建和关系保存孩子家长
的原因,这是很难的ORM是因为你可能有循环依赖,并且它不知道它需要首先创建一个ID的对象。有些ORM非常聪明,能够找出那些没有这种循环依赖的关系,但大多数不是。
答
这有什么区别,如果你去
newRow.SetParentRow(parentRow, RoleTable.Relations("RoleToRole"))
答
我建议你添加一个ForeignKeyConstraint,将UpdateRule设置为Cascade。
如果存在外键约束设置,则在更新父代时,ADO.NET非常智能,可以将父代ID推入数据集中的子代 - 因此,您需要在子代之前保存父代,但不一定保存父代在创建链接的孩子之前。当自引用时不尝试。 – Murph 2008-10-03 12:24:59