Como manter uma estrutura de árvore para uma tabela de banco de dados com auto incremento de IDs usando um ADO.NET conjunto de dados e um DataAdapter
Pergunta
Eu tenho uma auto-referencial Função de tabela que representa a estrutura de uma árvore
ID [INT] AUTO INCREMENT
Name [VARCHAR]
ParentID [INT]
Eu estou usando uma ADO.NET DataTable e 'DataAdapter' para carregar e guardar os valores desta tabela.Isso funciona se eu apenas criar filhos de linhas existentes.Se eu fizer uma criança de linha, então faça uma criança da criança que, em seguida, Actualizar, a IDENTIFICAÇÃO temporário valor gerado pela DataTable está indo para o ParentID coluna.Eu tenho os seguintes dados com relação definida:
dataset.Relations.Add(New DataRelation("RoleToRole",RoleTable.Columns("ID"), RoleTable.Columns("ParentID")))
E quando eu tornar a nova criança linhas na DataTable eu chamo o método SetParentRow
newRow.SetParentRow(parentRow)
Há algo de especial que eu tenho que fazer para obter o ID de geração para propagar recursivamente quando eu chamar Update do DataAdapter?
Solução
Eu não sei ADO.net em particular, mas a maioria Realiza não inserir automaticamente o ID de um novo registro em um relacionamento.Você vai ter que recorrer ao processo de 2 etapas:
- criar e guardar pai
- criar e salvar o filho com relação ao pai
A razão que isto é difícil para a Realiza é porque você pode ter dependências circulares, e ele não sei que objeto é necessário para criar uma IDENTIFICAÇÃO para o primeiro lugar.Alguns Realiza é inteligente o suficiente para descobrir essas relações onde não existem tais dependências circulares, mas a maioria não.
Outras dicas
Não faz diferença se você ir
newRow.SetParentRow(parentRow, RoleTable.Relations("RoleToRole"))
Eu sugiro que você adicione um ForeignKeyConstraint, com UpdateRule definido para a Cascata.