如何使用ADO.NET数据集和数据适配器将树结构持久化到具有自动递增ID的数据库表中
时间:2020-03-05 18:38:28 来源:igfitidea点击:
我有一个自我引用的角色表,代表一个树结构
ID [INT] AUTO INCREMENT Name [VARCHAR] ParentID [INT]
我正在使用ADO.NET DataTable和DataAdapter加载并将值保存到该表。如果仅创建现有行的子级,则此方法有效。如果我要创建一个子行,然后再创建一个子行,然后执行Update,则DataTable生成的临时ID值将进入ParentID列。我设置了以下数据关系:
dataset.Relations.Add(New DataRelation("RoleToRole",RoleTable.Columns("ID"), RoleTable.Columns("ParentID")))
当我在DataTable中创建新的子行时,我调用SetParentRow方法
newRow.SetParentRow(parentRow)
在DataAdapter上调用Update时,我需要做些特殊的事情来使ID生成以递归方式传播吗?
解决方案
回答
你去有什么区别吗
newRow.SetParentRow(parentRow, RoleTable.Relations("RoleToRole"))
回答
我并不特别了解ADO.net,但是大多数ORM不会自动在关系中插入新记录的ID。我们必须采用两步过程:
- 建立并保存父项
- 建立并保存与父母有关系的孩子
对于ORM而言,这很困难,原因是我们可能具有循环依赖关系,并且它不知道首先需要创建哪个ID的对象。一些ORM足够聪明,可以找出没有这种循环依赖关系的关系,但大多数不是。
回答
我建议我们添加一个ForeignKeyConstraint,并将UpdateRule设置为Cascade。