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);
return products.Any();}
}
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]:
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.
Me encanta este curso 💚, seria genial que existiera uno más avanzado. 🤓
Comparto tu opinión, es de los mejores cursos que he tomado, la forma en la que explica es excelente!
Me encantaría aprender con él MVC en .NET 😎
seria bueno llevar un curso avanzado de Blazor con este profe, muy bien explicado cada clase.
Les comparto compañeros que para evitar la validación del almacenamiento lo que realicé fué limpiar los campos una vez creado el almacenamiento.
Y posterior si realicé el proceso de validación para garantizar que no se cree el mismo producto repetidamente en una misma bodega.
Me alcance a asustar porque pensé que no se iba a dar cuenta del error XD
x2
Está manera de generar un id Compuesta me pareció muy creativa, aunque algo redundante tomando en cuenta que ya hay campos para idproducto, idbodega, sin embargo me pareció ingeniosa ya que se esta aplicando una AND sin tener que usar los operadores lógicos, además de dejarlo en una sola consulta a la base de datos.
En el metodo IsProductWarehouse() me parece que es más eficiente filtrar primero y convertir en lista después. Porque si tenemos 100 mil productos va a ser más lento el procesamiento.
Me gustaria el curso actualizado de ASP MVC cob este profe
Hola, necesito un poco de ayuda con esto no
Hola, Jairo :)
En el error dice "column does not allow nulls. INSERT fails", revisa que valor estás enviando como Partial Quantity :D
Puedes comentar si encontraste la causa y si ya pudiste solucionarlo.
:thumbsup: ¡Suerte!
Hola, Jairo!
Al crear el storage las propiedades : StoreId, StoreName, LastUpdate
son campos requeridos para poder guardar.
Recomiendo revisar la clase "StoreEntity" y ver cuales propiedades tienen el atributo como [Required]
Buenos dias y como puedo poner un buscado en vez del combo, es posible eso?
tengo un fallo a la hora de guardar el storage
'Microsoft.EntityFrameworkCore.DbUpdateException' en Microsoft.EntityFrameworkCore.dll
desconosco el motivo estoy enviando los datos requeridos con el formato correcto y las migraciones estan bien (ya realice el abm para product, warehouse y category solo esta fallan esta insercion)
😎
Saludos, necesitó un poco de ayuda no puedo hacer el almacenamiento .