Как сохранить древовидную структуру в таблице базы данных с автоматически увеличивающимися идентификаторами, используя ADO.NET DataSet и DataAdapter
Вопрос
У меня есть самоссылающаяся таблица ролей, которая представляет собой древовидную структуру
ID [INT] AUTO INCREMENT
Name [VARCHAR]
ParentID [INT]
Я использую ADO.NET DataTable и DataAdapter для загрузки и сохранения значений в эту таблицу.Это работает, если я создаю дочерние элементы только существующих строк.Если я создаю дочернюю строку, затем создаю дочерний элемент для этого дочернего элемента, затем обновляю, значение временного идентификатора, сгенерированное DataTable, попадает в столбец ParentID.У меня есть следующий набор отношений к данным:
dataset.Relations.Add(New DataRelation("RoleToRole",RoleTable.Columns("ID"), RoleTable.Columns("ParentID")))
И когда я создаю новые дочерние строки в DataTable, я вызываю метод SetParentRow
newRow.SetParentRow(parentRow)
Есть ли что-то особенное, что я должен сделать, чтобы заставить генерацию идентификатора распространяться рекурсивно, когда я вызываю Update в DataAdapter?
Решение
Я не знаю ADO.net в частности, но большинство ORM не будут автоматически вставлять идентификатор новой записи в связь.Вам придется прибегнуть к двухэтапному процессу:
- создание и сохранение родительского элемента
- создайте и сохраните дочерний элемент с привязкой к родительскому элементу
Причина, по которой это сложно для ORM, заключается в том, что у вас могут быть циклические зависимости, и он не будет знать, для какого объекта ему нужно создать идентификатор в первую очередь.Некоторые ORM достаточно умны, чтобы вычислять те взаимосвязи, в которых нет таких циклических зависимостей, но большинство из них таковыми не являются.
Другие советы
Имеет ли это какое-нибудь значение, если ты уйдешь
newRow.SetParentRow(parentRow, RoleTable.Relations("RoleToRole"))
Я предлагаю вам добавить ForeignKeyConstraint, для UpdateRule которого установлено значение Cascade.