Asociar productos a bodegas es una operación fundamental en cualquier sistema de inventario, y hacerlo correctamente implica validar que no existan registros duplicados antes de guardar. A continuación se explica paso a paso cómo construir la página de almacenamiento, crear la lógica de validación en la capa de negocio y resolver errores comunes de llave primaria.
¿Cómo crear la página de almacenamiento en Blazor?
El proceso comienza organizando la estructura de carpetas del proyecto. Dentro de la carpeta Pages se crea un nuevo folder llamado Storage [01:00]. Allí se agrega la página New Item cuyo componente se denomina CreateStoragePage.
Para que la página sea accesible se le asigna la ruta storage/storage/create, manteniendo la misma convención de rutas del proyecto [01:22]. Después se importa el componente desde la carpeta Componentes, donde previamente se agregó la subcarpeta de storage. Dentro de la página se invoca el componente CreateStorageComponent y se cierra correctamente.
¿Cómo agregar el enlace al menú de navegación?
El menú de navegación se encuentra en la carpeta shared (compartida). Se añade un nuevo link con la ruta storage/create y el título "Crear almacenamiento" [01:55]. Al refrescar la página, el enlace aparece en el menú y ya es posible visualizar el formulario con las listas de bodegas y productos.
¿Cómo validar que un producto no se duplique en la bodega?
La validación se realiza en la capa de negocio del almacenamiento. Se crea un método público y estático que retorna un valor booleano (bool) [02:35]. El método se llama IsProductInWarehouse y recibe como parámetro un string con el ID compuesto del almacenamiento.
csharp
public static bool IsProductInWarehouse(string id)
{
using (var context = new DatabaseContext())
{
var products = context.Storage
.ToList()
.Where(s => s.StorageId == id);
}
El patrón using permite cargar la conexión a la base de datos de forma eficiente y liberarla al finalizar [03:05]. Con Where se filtra la lista de almacenamientos buscando coincidencias, y Any() devuelve true si ya existe al menos un registro con ese identificador.
¿Cómo estandarizar el ID de almacenamiento?
Para garantizar unicidad se emplea una concatenación dinámica que combina el ID de la bodega y el ID del producto separados por un guion [04:30]:
csharp
storageId = $"{oStorage.WarehouseId}-{oStorage.ProductId}";
Esta interpolación de cadenas resulta más legible y flexible que la concatenación tradicional. El ID resultante se utiliza tanto para guardar como para verificar duplicados.
¿Cómo mostrar mensajes de resultado al usuario?
En el componente se declara una variable message que almacena el texto de retroalimentación [05:45]. La lógica es directa:
- Si
IsProductInWarehouse retorna falso: se registra el producto y el mensaje es "Producto registrado".
- Si retorna verdadero: no se guarda y el mensaje es "El producto ya existe en la bodega".
Para la presentación visual se aprovecha Bootstrap con la clase text-center y una etiqueta <h4> que muestra el mensaje centrado en pantalla.
¿Cómo resolver el error de violación de llave primaria?
Durante las pruebas iniciales surgió un error de violación de llave primaria (primary key violation) al intentar guardar un producto duplicado [07:10]. Al inspeccionar con F12 en el navegador se confirmó que el sistema permitía el paso del registro.
El problema radicó en que el método de validación comparaba contra ProductId en lugar de contra StorageId [08:00]. La corrección consistió en cambiar el parámetro y la comparación interna del método:
csharp
.Where(s => s.StorageId == id);
Tras corregir y ejecutar con Ctrl + F5 para limpiar la caché, la validación funcionó correctamente: al intentar registrar un producto que ya existía en la bodega, el sistema respondió con el mensaje adecuado sin generar excepciones [08:55].
Este tipo de errores es completamente normal durante el desarrollo de software. La clave está en depurar paso a paso, revisar los parámetros que se envían y confirmar que las comparaciones se realizan contra el campo correcto. Si has enfrentado errores similares con llaves primarias o validaciones, comparte tu experiencia en los comentarios.