Tutorial: Mejora de la validación de datos para EF Database First con la aplicación MVC de ASP.NET

Con MVC, Entity Framework y scaffolding de ASP.NET, puede crear una aplicación web que proporcione una interfaz a una base de datos existente. En esta serie de tutoriales se muestra cómo generar código automáticamente que permita a los usuarios mostrar, editar, crear y eliminar datos que residen en una tabla de base de datos. El código generado corresponde a las columnas de la tabla de base de datos.

Este tutorial se centra en agregar anotaciones de datos al modelo de datos para especificar los requisitos de validación y mostrar el formato. Se ha mejorado en función de los comentarios de los usuarios en la sección de comentarios.

En este tutorial, hizo lo siguiente:

  • Adición de anotaciones de datos
  • Adición de clases de metadatos

Requisitos previos

Adición de anotaciones de datos

Como ha visto en un tema anterior, algunas reglas de validación de datos se aplican automáticamente a la entrada del usuario. Por ejemplo, solo puede proporcionar un número para la propiedad Grade. Para especificar más reglas de validación de datos, puede agregar anotaciones de datos a la clase de modelo. Estas anotaciones se aplican en toda la aplicación web para la propiedad especificada. También puede aplicar atributos de formato que cambien la forma en que se muestran las propiedades; por ejemplo, cambiar el valor utilizado para las etiquetas de texto.

En este tutorial, agregará anotaciones de datos para restringir la longitud de los valores proporcionados para las propiedades FirstName, LastName y MiddleName. En la base de datos, estos valores están limitados a 50 caracteres; sin embargo, en la aplicación web no se aplica actualmente el límite de caracteres. Si un usuario proporciona más de 50 caracteres para uno de esos valores, la página se bloqueará al intentar guardar el valor en la base de datos. También restringirá los valores de Grade a valores comprendidos entre 0 y 4.

Seleccione Modelos>ContosoModel.edmx>ContosoModel.tt y abra el archivo Student.cs. Agregue el siguiente código resaltado a la clase.

namespace ContosoSite.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    
    public partial class Student
    {
        public Student()
        {
            this.Enrollments = new HashSet<Enrollment>();
        }
    
        public int StudentID { get; set; }
        [StringLength(50)]
        public string LastName { get; set; }
        [StringLength(50)]
        public string FirstName { get; set; }
        public Nullable<System.DateTime> EnrollmentDate { get; set; }
        [StringLength(50)]
        public string MiddleName { get; set; }
    
        public virtual ICollection<Enrollment> Enrollments { get; set; }
    }
}

Abra Enrollment.cs y agregue el código resaltado siguiente.

namespace ContosoSite.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    
    public partial class Enrollment
    {
        public int EnrollmentID { get; set; }
        [Range(0, 4)]
        public Nullable<decimal> Grade { get; set; }
        public int CourseID { get; set; }
        public int StudentID { get; set; }
    
        public virtual Course Course { get; set; }
        public virtual Student Student { get; set; }
    }
}

Compile la solución.

Haga clic en Lista de alumnos y seleccione Editar. Si intenta escribir más de 50 caracteres, se muestra un mensaje de error.

show error message

Retroceder a la página principal. Haga clic en Lista de inscripciones y seleccione Editar. Intente proporcionar una calificación superior a 4. Recibirá este error: El campo Grade debe estar comprendido entre 0 y 4.

Adición de clases de metadatos

Agregar los atributos de validación directamente a la clase de modelo funciona cuando no espera que cambie la base de datos; sin embargo, si la base de datos cambia y necesita volver a generar la clase de modelo, perderá todos los atributos que había aplicado a la clase de modelo. Este enfoque puede ser muy ineficaz y propenso a perder reglas de validación importantes.

Para evitar este problema, puede agregar una clase de metadatos que contenga los atributos. Al asociar la clase de modelo a la clase de metadatos, esos atributos se aplican al modelo. En este enfoque, la clase de modelo se puede volver a generar sin perder todos los atributos que se han aplicado a la clase de metadatos.

En la carpeta Modelos, agregue una clase denominada Metadata.cs.

Reemplace el código de Metadata.cs por el código siguiente.

using System;
using System.ComponentModel.DataAnnotations;

namespace ContosoSite.Models
{
    public class StudentMetadata
    {
        [StringLength(50)]
        [Display(Name="Last Name")]
        public string LastName;

        [StringLength(50)]
        [Display(Name="First Name")]
        public string FirstName;

        [StringLength(50)]
        [Display(Name="Middle Name")]
        public string MiddleName;

        [Display(Name = "Enrollment Date")]
        public Nullable<System.DateTime> EnrollmentDate;
    }

    public class EnrollmentMetadata
    {
        [Range(0, 4)]
        public Nullable<decimal> Grade;
    }
}

Estas clases de metadatos contienen todos los atributos de validación que había aplicado anteriormente a las clases de modelo. El atributo Display se usa para cambiar el valor usado para las etiquetas de texto.

Ahora, debe asociar las clases de modelo a las clases de metadatos.

En la carpeta Models, agregue una clase denominada PartialClasses.cs.

Reemplace el contenido del archivo por el código siguiente.

using System;
using System.ComponentModel.DataAnnotations;

namespace ContosoSite.Models
{
    [MetadataType(typeof(StudentMetadata))]
    public partial class Student
    {
    }

    [MetadataType(typeof(EnrollmentMetadata))]
    public partial class Enrollment
    {
    }
}

Observe que cada clase está marcada como una clase partial y cada una coincide con el nombre y el espacio de nombres como la clase que se genera automáticamente. Al aplicar el atributo de metadatos a la clase parcial, asegúrese de que los atributos de validación de datos se aplicarán a la clase generada automáticamente. Estos atributos no se perderán al volver a generar las clases de modelo porque el atributo de metadatos se aplica en clases parciales que no se vuelven a generar.

Para volver a generar las clases generadas automáticamente, abra el archivo ContosoModel.edmx. Una vez más, haga clic con el botón derecho en la superficie de diseño y seleccione Actualizar modelo de la base de datos. Aunque no haya cambiado la base de datos, este proceso volverá a generar las clases. En la pestaña Actualizar, seleccione Tablas y Finalizar.

Guarde el archivo ContosoModel.edmx para aplicar los cambios.

Abra el archivo Student.cs o el archivo Enrollment.cs y observe que los atributos de validación de datos que aplicó anteriormente ya no están en el archivo. Sin embargo, ejecute la aplicación y observe que las reglas de validación se siguen aplicando al escribir datos.

Conclusión

Esta serie proporcionó un ejemplo sencillo de cómo generar código a partir de una base de datos existente que permite a los usuarios editar, actualizar, crear y eliminar datos. Se usó ASP.NET MVC 5, Entity Framework y scaffolding de ASP.NET para crear el proyecto.

Para obtener un ejemplo introductorio del desarrollo de Code First, consulte Introducción a ASP.NET MVC 5.

Para obtener un ejemplo más avanzado, consulte Creación de un modelo de datos de Entity Framework para una aplicación de ASP.NET MVC 4. Tenga en cuenta que la API DbContext que se usa para trabajar con datos en Database First es la misma que la API que se usa para trabajar con datos en Code First. Incluso si piensa usar Database First, puede aprender a controlar escenarios más complejos, como leer y actualizar datos relacionados, controlar conflictos de simultaneidad, etc. de un tutorial de Code First. La única diferencia estriba en cómo se crean la base de datos, la clase de contexto y las clases de entidad.

Recursos adicionales

Para obtener una lista completa de las anotaciones de validación de datos que puede aplicar a propiedades y clases, consulte System.ComponentModel.DataAnnotations.

Pasos siguientes

En este tutorial ha:

  • Anotaciones de datos agregadas
  • Clases de metadatos agregadas

Para obtener información sobre cómo implementar una aplicación web y una base de datos SQL en Azure App Service, consulte este tutorial: