Condividi tramite


Esercitazione: Migliorare la convalida dei dati per EF Database First con ASP.NET'app MVC

Usando MVC, Entity Framework e ASP.NET Scaffolding, è possibile creare un'applicazione Web che fornisce un'interfaccia a un database esistente. Questa serie di esercitazioni illustra come generare automaticamente codice che consente agli utenti di visualizzare, modificare, creare ed eliminare dati che si trovano in una tabella di database. Il codice generato corrisponde alle colonne della tabella di database.

Questa esercitazione è incentrata sull'aggiunta di annotazioni di dati al modello di dati per specificare i requisiti di convalida e visualizzare la formattazione. È stato migliorato in base al feedback degli utenti nella sezione commenti.

In questa esercitazione:

  • Aggiungere annotazioni dati
  • Aggiungere classi di metadati

Prerequisiti

Aggiungere annotazioni dati

Come illustrato in un argomento precedente, alcune regole di convalida dei dati vengono applicate automaticamente all'input dell'utente. Ad esempio, è possibile specificare solo un numero per la proprietà Grade. Per specificare altre regole di convalida dei dati, è possibile aggiungere annotazioni di dati alla classe modello. Queste annotazioni vengono applicate in tutta l'applicazione Web per la proprietà specificata. È anche possibile applicare attributi di formattazione che modificano la modalità di visualizzazione delle proprietà; ad esempio, modifica del valore utilizzato per le etichette di testo.

In questa esercitazione verranno aggiunte annotazioni dati per limitare la lunghezza dei valori forniti per le proprietà FirstName, LastName e MiddleName. Nel database questi valori sono limitati a 50 caratteri; Tuttavia, nell'applicazione Web che il limite di caratteri non è attualmente applicato. Se un utente fornisce più di 50 caratteri per uno di questi valori, la pagina si arresterà in modo anomalo quando si tenta di salvare il valore nel database. Si limiterà anche Il grado ai valori compresi tra 0 e 4.

Selezionare Modelli>ContosoModel.edmx>ContosoModel.tt e aprire il file Student.cs . Aggiungere il codice evidenziato seguente alla classe.

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; }
    }
}

Aprire Enrollment.cs e aggiungere il codice evidenziato seguente.

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; }
    }
}

Compilare la soluzione.

Fare clic su Elenco degli studenti e selezionare Modifica. Se si tenta di immettere più di 50 caratteri, viene visualizzato un messaggio di errore.

visualizzare il messaggio di errore

Indietro alla home page. Fare clic su Elenco di registrazioni e selezionare Modifica. Tentare di fornire un grado superiore a 4. Verrà visualizzato questo errore: il campo Grade deve essere compreso tra 0 e 4.

Aggiungere classi di metadati

L'aggiunta degli attributi di convalida direttamente alla classe modello funziona quando non si prevede che il database venga modificato; tuttavia, se il database cambia e è necessario rigenerare la classe modello, si perderanno tutti gli attributi applicati alla classe modello. Questo approccio può essere molto inefficiente e soggetto a perdere regole di convalida importanti.

Per evitare questo problema, è possibile aggiungere una classe di metadati contenente gli attributi. Quando si associa la classe modello alla classe di metadati, tali attributi vengono applicati al modello. In questo approccio la classe modello può essere rigenerata senza perdere tutti gli attributi applicati alla classe di metadati.

Nella cartella Models aggiungere una classe denominata Metadata.cs.

Sostituire il codice in Metadata.cs con il codice seguente.

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;
    }
}

Queste classi di metadati contengono tutti gli attributi di convalida applicati in precedenza alle classi di modello. L'attributo Display viene usato per modificare il valore utilizzato per le etichette di testo.

È ora necessario associare le classi di modello alle classi di metadati.

Nella cartella Models aggiungere una classe denominata PartialClasses.cs.

Sostituire il contenuto del file con il codice seguente.

using System;
using System.ComponentModel.DataAnnotations;

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

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

Si noti che ogni classe è contrassegnata come partial classe e ogni corrisponde al nome e allo spazio dei nomi come classe generata automaticamente. Applicando l'attributo dei metadati alla classe parziale, assicurarsi che gli attributi di convalida dei dati vengano applicati alla classe generata automaticamente. Questi attributi non verranno persi quando si rigenerano le classi di modello perché l'attributo dei metadati viene applicato nelle classi parziali che non vengono rigenerate.

Per rigenerare le classi generate automaticamente, aprire il file ContosoModel.edmx . Ancora una volta, fare clic con il pulsante destro del mouse sull'area di progettazione e scegliere Aggiorna modello dal database. Anche se il database non è stato modificato, questo processo rigenera le classi. Nella scheda Aggiorna selezionare Tabelle e Fine.

Salvare il file ContosoModel.edmx per applicare le modifiche.

Aprire il file Student.cs o il file Enrollment.cs e notare che gli attributi di convalida dei dati applicati in precedenza non sono più presenti nel file. Tuttavia, eseguire l'applicazione e notare che le regole di convalida vengono ancora applicate quando si immettono i dati.

Conclusione

Questa serie ha fornito un semplice esempio di come generare codice da un database esistente che consente agli utenti di modificare, aggiornare, creare ed eliminare dati. È stato usato ASP.NET MVC 5, Entity Framework e ASP.NET Scaffolding per creare il progetto.

Per un esempio introduttivo dello sviluppo code first, vedere Introduzione con ASP.NET MVC 5.

Per un esempio più avanzato, vedere Creazione di un modello di dati Entity Framework per un'app MVC 4 ASP.NET. Si noti che l'API DbContext usata per l'uso dei dati in Database First è uguale all'API usata per l'uso dei dati in Code First. Anche se si intende usare Database First, è possibile imparare a gestire scenari più complessi, ad esempio la lettura e l'aggiornamento dei dati correlati, la gestione dei conflitti di concorrenza e così via da un'esercitazione Code First. L'unica differenza consiste nel modo in cui vengono create le classi di database, classe di contesto e entità.

Risorse aggiuntive

Per un elenco completo delle annotazioni di convalida dei dati, è possibile applicare alle proprietà e alle classi, vedere System.ComponentModel.DataAnnotations.

Passaggi successivi

In questa esercitazione:

  • Aggiunta di annotazioni di dati
  • Aggiunta di classi di metadati

Per informazioni su come distribuire un'app Web e un database SQL in Servizio app di Azure, vedere questa esercitazione: