Modelar referencias propietarias
Algunas relaciones de tus datos son composiciones: la cosa referenciada solo tiene sentido en el contexto de su padre y desaparece con él. Un pedido tiene líneas; una encuesta tiene preguntas; una factura tiene filas de desglose de impuestos. Yellow lo modela con referencias propietarias — una restricción de referencia de instancia marcada con Owned = true.
Este tutorial construye una composición Order + OrderLine de principio a fin.
1. Los dos modelos
Crea dos modelos en tu schema:
OrderLine — representa una línea de un pedido.
product— Referencia a una instancia deProduct(referencia normal; los productos existen independientemente).quantity— Integer, obligatorio.unitPrice— Decimal, obligatorio.lineTotal— Decimal, virtual (quantity * unitPrice).
Order — el padre.
number— String, propiedad principal.customer— Referencia a una instancia deCustomer.lines— Colección de referencias aOrderLine.total— Decimal, virtual (suma delines.lineTotal).createdOn— DateTime.
2. Marca la colección de líneas como propietaria
En Order.lines, añade una restricción de colección con:
Item type=INSTANCE_REFERENCETarget model=OrderLine
Luego añade una restricción de referencia de instancia al elemento de la colección, con:
Target model=OrderLineOwned= true
El indicador Owned cambia cómo Yellow trata la relación:
- Al crear un
Ordercon instancias nuevas deOrderLine, las guarda en el mismo lote — las líneas no existen antes que su padre. - Al editar el pedido puedes añadir, quitar o reordenar líneas en la misma pantalla.
- Al borrar el pedido se hace soft-delete de todas las líneas que posee. Borrar una referencia no propietaria dejaría el objetivo intacto.
3. Comportamiento del formulario
Abre el modelo Order y crea un pedido nuevo. La colección lines muestra un botón incrustado + Añadir línea en lugar de un desplegable — como las líneas son propietarias, el editor sabe que debe crearlas in situ en lugar de elegirlas de las existentes.
Añadir una línea abre el formulario de OrderLine en línea. Rellénala, guarda el padre, y tanto el pedido como sus líneas se guardan juntos.
4. Auditoría e historial
Las referencias propietarias consolidan la traza de auditoría: ver el historial de un pedido muestra las líneas que había activas en ese momento. Restaurar una versión anterior del pedido restaura también sus líneas.
Cuándo usar propietaria vs referencia normal
| Hazla propietaria cuando… | Hazla referencia normal cuando… |
|---|---|
| El hijo no tiene sentido sin el padre (líneas de pedido, filas de desglose). | El objetivo existe independientemente (un cliente, un producto). |
| Borrar el padre debe eliminar el hijo. | El mismo objetivo lo reutilizan muchos padres. |
| El usuario espera gestionar ambos a la vez en un solo formulario. | El usuario elige el objetivo de una lista existente. |
5. Por contraste, una referencia no propietaria
Order.customer es una referencia normal — los clientes se comparten entre pedidos. El formulario muestra un desplegable de clientes existentes. Borrar un pedido deja al cliente tranquilo.
Las dos relaciones están en el mismo modelo a propósito: los pedidos poseen sus líneas, pero referencian a los clientes.
Relacionados
- Restricciones — la referencia completa de la restricción de referencia de instancia.
- Tipos de propiedad — colecciones, referencias.
- Diseñar un formulario — dar forma al formulario de pedido una vez existen estos modelos.