У меня есть самореференционная таблица ролей, которая представляет собой древовидную структуру.
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?





Есть ли разница, если ты уйдешь?
newRow.SetParentRow(parentRow, RoleTable.Relations("RoleToRole"))
Я не знаю, в частности, ADO.net, но большинство ORM не будут автоматически вставлять идентификатор новой записи в отношение. Вам придется прибегнуть к двухэтапному процессу:
Причина, по которой это сложно для ORM, заключается в том, что у вас могут быть циклические зависимости, и он не будет знать, какой объект ему нужен для создания идентификатора в первую очередь. Некоторые ORM достаточно умны, чтобы выяснить те отношения, в которых нет таких циклических зависимостей, но большинство из них - нет.
Я предлагаю вам добавить ForeignKeyConstraint с UpdateRule, установленным на Cascade.
ADO.NET достаточно умен, чтобы протолкнуть родительский идентификатор в дочерний элемент в наборе данных, когда родительский элемент обновляется, если установлено ограничение внешнего ключа, поэтому вам нужно сохранить родительский элемент перед дочерним, но не обязательно сохранять родительский элемент, прежде чем создавать связанный дочерний элемент. Не пробовал, когда ссылается на себя.