Manipulación estricta de Entity Framework Core, Reglas de "Soft Delete", Eager Loading, Auditorías automáticas y Control de Duplicados DB.
Objetivo Primario: La integridad y rastreabilidad forense de los datos en este sistema universitario es el activo máximo. No se tolera pérdida física de información.
En registros core (User, Equipment, Verification), ESTÁ ESTRICTAMENTE PROHIBIDO ejecutar _context.Entidad.Remove(...) (Delete físico).
Entidad.Status = Status.Deleted o Status.Inactivo.EquipmentStateHistory), debes insertar un registro histórico nuevo anexando el Status.Deleted y cerrar la fecha del registro anterior si existiese.await _context.SaveChangesAsync()!Asegura que ApplicationDbContext globalice .HasQueryFilter(e => e.Status != EquipmentStatus.Deleted) en la definición .OnModelCreating. Si no es posible, cada query LINQ .Where(...) debe filtrar explícitamente los dados de baja.
.Clean() y .IsValidName()La base de datos repudia espacios dobles o carácteres ciegos.
Input.Name = Input.Name.Clean();.IsValidName() en el Frontend / InputModel para purgar "%$&".Si diseñas tablas con Códigos Biométricos, DNI o Nros. de Inventario:
DbSet.HasIndex(x => x.InventoryNumber).IsUnique() (A nivel tabla SQL).OnPostAsync() antes de golpear el Contexto SQL.⚠️ WARNING (Edit Mode): En el ciclo "Editar", al buscar unicidad asegúrate de IGNORAR el registro actual:
.Where(e => e.Code == In.Code && e.Id != In.Id). Y siempre notifica del error con el sistemaNotificationHelper.
.Include()) de HierroEvitar Excepciones Null en cascada al renderizar Razor (Model.Objeto.Relacional.String).
OnGetAsync o Detail/Edit debe cargar dependencias complejas anidando .Include(x => x.Padre).ThenInclude(p => p.Abuelo). Descartarlo trae colapsos fatales en tiempo de ejecución.Una entidad núcleo debe implementar o contener estas 4 cabeceras: CreatedBy, CreatedDate, ModifiedBy, LastModifiedDate.
ApplicationDbContext.SaveChangesAsync() ya inyecta estas variables dinámicamente según el claim ID del usuario autenticado; PERO, debes asegurarte que tus modelos Models/ expongan estas propiedades relacionales hacia User. No las toques manualmente en tu PageModel.