Estou brincando com HierarchyId e não descobri uma maneira baseada em conjunto para fazer o seguinte:
- inserir todas as subárvores de uma vez
- recuperar todas as subárvores de uma vez
Esta questão está relacionada à minha anterior e suspeito que a única maneira de realizar essas duas tarefas com HierarchyId seja um nó ou um nível por vez. Se eu estiver usando o caminho materializado, ambas as ações são facilmente realizadas por um único (e trivial) comando baseado em conjunto.
o que estou perdendo?
Editar: também perdi uma maneira de mover uma subárvore, mas aprendi com o comentário de Mikael Eriksson
A função a ser usada é GetReparentedValue, mas ao usar apenas
GetReparentedValue
a árvore pode acabar em um estado "inconsistente".Aqui está um código fornecido pela Microsoft que cuida disso. Movendo subárvores .
Eu acho que relacionado a isso está Impondo uma árvore . Ele usa uma coluna calculada para o id pai que faz uma autojunção ao PK.
Recuperar uma subárvore inteira é simples - use o
IsDescendentOf
método, conforme MSDNA inserção é mais complexa, mas seu principal problema será com suas restrições - você obviamente não pode inserir objetos filho até que seu pai tenha sido confirmado. Nesse caso, itere e insira em ordem hierárquica ou desative as restrições e insira.
Ao inserir uma grande quantidade de dados - migração, inserção em lote ou em massa, etc. - eu desativava a restrição. Ao inserir operacionalmente, eu iteraria, pois não encontrei instâncias durante a execução do sistema em que grandes quantidades de grandes precisam ser inseridas na hierarquia.