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

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

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?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
0
1 491
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Есть ли разница, если ты уйдешь?

newRow.SetParentRow(parentRow, RoleTable.Relations("RoleToRole"))
Ответ принят как подходящий

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

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

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

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

Murph 03.10.2008 16:24

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

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