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

StackOverflow https://stackoverflow.com/questions/5263

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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 не будут автоматически вставлять идентификатор новой записи в связь.Вам придется прибегнуть к двухэтапному процессу:

  1. создание и сохранение родительского элемента
  2. создайте и сохраните дочерний элемент с привязкой к родительскому элементу

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

Другие советы

Имеет ли это какое-нибудь значение, если ты уйдешь

newRow.SetParentRow(parentRow, RoleTable.Relations("RoleToRole"))

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top