Como você persistir uma estrutura de árvore a uma tabela de banco de dados com auto IDs incrementando usando um DataSet ADO.NET e um DataAdapter

votos
4

Eu tenho uma tabela Papel auto-referencial que representa uma estrutura de árvore

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

Eu estou usando um DataTable ADO.NET e DataAdapter para carregar e salvar valores para esta tabela. Isso funciona se eu só criar filhos de linhas existentes. Se eu fizer uma linha filha, em seguida, fazer uma criança dessa criança, em seguida, atualização, o valor ID temporário gerado pelo DataTable está indo para a coluna ParentID. Eu tenho o seguinte conjunto de relação de dados:

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

E quando eu faço novas linhas criança na DataTable eu chamo o método SetParentRow

newRow.SetParentRow(parentRow)

Existe algo especial que tenho que fazer para obter a geração de ID para propagar de forma recursiva quando eu chamo Atualização sobre o DataAdapter?

Publicado 07/08/2008 em 21:23
fonte usuário
Em outras línguas...                            


3 respostas

votos
1

Eu não sei ADO.net em particular, mas a maioria ORMs não irá inserir automaticamente o ID de um novo registro em um relacionamento. Você vai ter que recorrer ao processo de 2 etapas:

  1. criar e salvar pai
  2. criar e salvar criança com relação ao pai

A razão por que isso é difícil para ORMs é porque você pode ter dependências circulares, e não saberia qual objeto que precisava para criar um ID para o primeiro. Alguns ORMs são inteligentes o suficiente para descobrir essas relações onde não existem tais dependências circulares, mas a maioria não são.

Respondeu 23/08/2008 em 19:37
fonte usuário

votos
0

Eu sugiro que você adicionar um ForeignKeyConstraint, com UpdateRule definido para Cascade.

Respondeu 01/10/2008 em 12:29
fonte usuário

votos
0

Faz alguma diferença se você ir

newRow.SetParentRow(parentRow, RoleTable.Relations("RoleToRole"))
Respondeu 08/08/2008 em 00:57
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more