¿Cómo se persiste una estructura de árbol en una tabla de base de datos con ID de incremento automático utilizando un conjunto de datos ADO.NET y un adaptador de datos?

StackOverflow https://stackoverflow.com/questions/5263

  •  08-06-2019
  •  | 
  •  

Pregunta

Tengo una tabla de Roles autorreferencial que representa una estructura de árbol

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

Estoy usando ADO.NET DataTable y DataAdapter para cargar y guardar valores en esta tabla.Esto funciona si solo creo hijos de filas existentes.Si creo una fila secundaria, luego hago una fila secundaria de ese niño, luego actualizo, el valor de ID temporal generado por DataTable irá a la columna ParentID.Tengo el siguiente conjunto de relaciones de datos:

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

Y cuando creo nuevas filas secundarias en DataTable, llamo al método SetParentRow

newRow.SetParentRow(parentRow)

¿Hay algo especial que deba hacer para que la generación de ID se propague de forma recursiva cuando llamo a Update en DataAdapter?

¿Fue útil?

Solución

No conozco ADO.net en particular, pero la mayoría de los ORM no insertan automáticamente el ID de un nuevo registro en una relación.Tendrás que recurrir al proceso de 2 pasos:

  1. construir y guardar padre
  2. construir y salvar al niño con relación a los padres

La razón por la que esto es difícil para los ORM es porque es posible que tenga dependencias circulares y no sabría para qué objeto necesita crear una identificación primero.Algunos ORM son lo suficientemente inteligentes como para descubrir aquellas relaciones en las que no existen dependencias circulares, pero la mayoría no las hay.

Otros consejos

¿Hace alguna diferencia si vas?

newRow.SetParentRow(parentRow, RoleTable.Relations("RoleToRole"))

Le sugiero que agregue ForeignKeyConstraint, con UpdateRule configurado en Cascade.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top