Сведения о вопросе

FromRussia

16:03, 1st July, 2020

Теги

.net   database   ado.net    

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

Просмотров: 508   Ответов: 3

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

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

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

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

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

newRow.SetParentRow(parentRow)

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



  Сведения об ответе

FAriza

18:03, 1st July, 2020

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

  1. построить и сохранить родительский файл
  2. построить и сохранить ребенка с отношением к родителю

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


  Сведения об ответе

COOL

18:03, 1st July, 2020

Есть ли какая-то разница, если ты уйдешь

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


  Сведения об ответе

+-*/

18:03, 1st July, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться