Estoy jugando con HierarchyId, y no he descubierto una forma establecida de hacer lo siguiente:
- inserte todos los subárboles a la vez
- recuperar todos los subárboles a la vez
Esta pregunta está relacionada con la anterior , y sospecho que la única forma de lograr estas dos tareas con HierarchyId es un nodo o un nivel a la vez. Si estoy usando una ruta materializada, ambas acciones se logran fácilmente mediante un comando único (y trivial) basado en un conjunto.
¿Qué me estoy perdiendo?
Editar: También perdí una forma de mover un subárbol, pero lo aprendí del comentario de Mikael Eriksson
Respuestas:
La función a usar es GetReparentedValue pero cuando se usa solo
GetReparentedValue
el árbol puede terminar en un estado "inconsistente".Aquí hay un código proporcionado por Microsoft que se encarga de eso. Subterráneos en movimiento .
Supongo que lo relacionado con esto es hacer cumplir un árbol . Utiliza una columna calculada para la identificación principal que se une automáticamente a la PK.
fuente
Recuperar un subárbol completo es simple: use el
IsDescendentOf
método, según MSDNLa inserción es más compleja, pero su problema principal será con sus restricciones: obviamente, no puede insertar objetos secundarios hasta que su padre se haya confirmado. En este caso, repita e inserte en orden jerárquico, o desactive las restricciones e inserte.
Al insertar una gran cantidad de datos (migración, inserción por lotes o por lotes, etc.), desactivaba la restricción. Al insertar operacionalmente, iteraría, ya que no he encontrado instancias durante la ejecución del sistema en las que grandes cantidades de grandes necesiten insertarse en la jerarquía.
fuente