Как сохранить древовидную структуру в таблице базы данных с автоматически увеличивающимися идентификаторами, используя ADO.NET DataSet и DataAdapter - PullRequest
6 голосов
/ 08 августа 2008

У меня есть справочная таблица ролей, которая представляет собой древовидную структуру

ID [INT] AUTO INCREMENT
Name [VARCHAR]
ParentID [INT]

Я использую ADO.NET DataTable и DataAdapter для загрузки и сохранения значений в этой таблице. Это работает, если я только создаю дочерние элементы существующих строк. Если я создаю дочернюю строку, затем делаю ее дочерней, а затем Update, значение временного идентификатора, сгенерированное DataTable, помещается в столбец ParentID. У меня установлено следующее отношение данных:

dataset.Relations.Add(New DataRelation("RoleToRole",RoleTable.Columns("ID"), RoleTable.Columns("ParentID")))

И когда я создаю новые дочерние строки в DataTable, я вызываю метод SetParentRow

newRow.SetParentRow(parentRow)

Есть ли что-то особенное, что я должен сделать, чтобы генерация идентификаторов распространялась рекурсивно, когда я вызываю Update для DataAdapter?

Ответы [ 3 ]

1 голос
/ 23 августа 2008

В частности, я не знаю ADO.net, но большинство ORM не будут автоматически вставлять идентификатор новой записи в отношение. Вам придется прибегнуть к двухэтапному процессу:

  1. сборка и сохранение родителя
  2. построить и сохранить ребенка с родителями

Причина, по которой это сложно для ORM, заключается в том, что у вас могут быть циклические зависимости, и он не будет знать, для какого объекта ему нужно сначала создать идентификатор. Некоторые ORM достаточно умны, чтобы выяснить те отношения, где нет таких циклических зависимостей, но большинство - нет.

0 голосов
/ 01 октября 2008

Я предлагаю вам добавить ForeignKeyConstraint с UpdateRule, установленным в Cascade.

0 голосов
/ 08 августа 2008

Имеет ли значение, если вы идете

newRow.SetParentRow(parentRow, RoleTable.Relations("RoleToRole"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...