Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Nota
Una versione aggiornata di questa esercitazione è disponibile qui che usa ASP.NET MVC 5 e Visual Studio 2013. È più sicuro, molto più semplice da seguire e dimostra più funzionalità.
Questa esercitazione illustra le nozioni di base per la creazione di un'applicazione Web MVC ASP.NET con Microsoft Visual Web Developer 2010 Express Service Pack 1, una versione gratuita di Microsoft Visual Studio. Prima di iniziare, assicurarsi di aver installato i prerequisiti elencati di seguito. È possibile installarli tutti facendo clic sul collegamento seguente: Programma di installazione della piattaforma Web. In alternativa, è possibile installare singolarmente i prerequisiti usando i collegamenti seguenti:
- Prerequisiti di Visual Studio Web Developer Express SP1
- ASP.NET aggiornamento degli strumenti MVC 3
- SQL Server Compact 4.0(runtime + tools support)
Se si usa Visual Studio 2010 anziché Visual Web Developer 2010, installare i prerequisiti facendo clic sul collegamento seguente: Prerequisiti di Visual Studio 2010.
Per questo argomento è disponibile un progetto Visual Web Developer con codice sorgente C#. Scaricare la versione C#. Se si preferisce Visual Basic, passare alla versione visual Basic di questa esercitazione.
In questa sezione verranno apportate alcune modifiche alle classi del modello e si apprenderà come aggiornare lo schema del database in modo che corrisponda alle modifiche del modello.
Aggiunta di una proprietà Rating al modello Movie
Per iniziare, aggiungere una nuova Rating proprietà alla classe esistente Movie . Aprire il file Movie.cs e aggiungere la Rating proprietà come quella seguente:
public string Rating { get; set; }
La classe completa Movie è ora simile al codice seguente:
public class Movie
{
public int ID { get; set; }
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
public string Rating { get; set; }
}
Ricompilare l'applicazione usando il comando di menu Debug>compila filmato.
Dopo aver aggiornato la Model classe, è necessario aggiornare anche i modelli di visualizzazione \Views\Movies\Index.cshtml e \Views\Movies\Create.cshtml per supportare la nuova Rating proprietà.
Aprire il file \Views\Movies\Index.cshtml e aggiungere un'intestazione di <th>Rating</th> colonna subito dopo la colonna Price . Aggiungere quindi una <td> colonna alla fine del modello per eseguire il rendering del @item.Rating valore. Di seguito è riportato l'aspetto del modello di visualizzazione Index.cshtml aggiornato:
<table>
<tr>
<th></th>
<th>Title</th>
<th>Release Date</th>
<th>Genre</th>
<th>Price</th>
<th>Rating</th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.ReleaseDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Genre)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
@Html.DisplayFor(modelItem => item.Rating )
</td>
<td>
@Html.ActionLink("Edit Me", "Edit", new { id=item.ID }) |
@Html.ActionLink("Details", "Details", new { id=item.ID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.ID })
</td>
</tr>
}
</table>
Aprire quindi il file \Views\Movies\Create.cshtml e aggiungere il markup seguente alla fine del modulo. Questo esegue il rendering di una casella di testo in modo che sia possibile specificare una classificazione quando viene creato un nuovo film.
<div class="editor-label">
@Html.LabelFor(model => model.Rating)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Rating)
@Html.ValidationMessageFor(model => model.Rating)
</div>
Gestione delle differenze tra il modello e lo schema del database
Il codice dell'applicazione è stato aggiornato per supportare la nuova Rating proprietà.
Eseguire ora l'applicazione e passare all'URL /Movies . Quando si esegue questa operazione, tuttavia, verrà visualizzato l'errore seguente:

Questo errore viene visualizzato perché la classe del modello aggiornata Movie nell'applicazione è ora diversa dallo schema della Movie tabella del database esistente. Nella tabella del database non è presente una colonna Rating.
Per impostazione predefinita, quando si usa Entity Framework Code First per creare automaticamente un database, come illustrato in precedenza in questa esercitazione, Code First aggiunge una tabella al database per tenere traccia se lo schema del database è sincronizzato con le classi del modello da cui è stato generato. Se non sono sincronizzati, Entity Framework genera un errore. In questo modo è più semplice tenere traccia dei problemi in fase di sviluppo che altrimenti potrebbero essere rilevati solo (da errori oscurati) in fase di esecuzione. La funzionalità di controllo della sincronizzazione è ciò che fa sì che venga visualizzato il messaggio di errore appena visualizzato.
Esistono due approcci per risolvere l'errore:
- Fare in modo che Entity Framework elimini e crei di nuovo automaticamente il database in base al nuovo schema di classi del modello. Questo approccio è molto pratico quando si esegue lo sviluppo attivo in un database di test, perché consente di evolvere rapidamente il modello e lo schema del database insieme. Lo svantaggio, tuttavia, è che si perdono i dati esistenti nel database, quindi non si vuole usare questo approccio in un database di produzione.
- Modificare esplicitamente lo schema del database esistente in modo che corrisponda alle classi del modello. Il vantaggio di questo approccio è che i dati vengono mantenuti. È possibile apportare questa modifica manualmente o creando uno script di modifica del database.
Per questa esercitazione si userà il primo approccio, con Entity Framework Code First che verrà ricreato automaticamente il database ogni volta che il modello cambia.
Ricreazione automatica del database nelle modifiche del modello
Aggiornare l'applicazione in modo che Code First venga eliminato e ricreato automaticamente il database ogni volta che si modifica il modello per l'applicazione.
Nota
Avviso È consigliabile abilitare questo approccio per eliminare e creare nuovamente il database solo quando si usa un database di sviluppo o test e non in un database di produzione che contiene dati reali. L'uso in un server di produzione può causare la perdita di dati.
In Esplora soluzioni fare clic con il pulsante destro del mouse sulla cartella Modelli, scegliere Aggiungi e quindi selezionare Classe.

Denominare la classe "MovieInitializer". Aggiornare la MovieInitializer classe in modo che contenga il codice seguente:
using System;
using System.Collections.Generic;
using System.Data.Entity;
namespace MvcMovie.Models {
public class MovieInitializer : DropCreateDatabaseIfModelChanges<MovieDBContext> {
protected override void Seed(MovieDBContext context) {
var movies = new List<Movie> {
new Movie { Title = "When Harry Met Sally",
ReleaseDate=DateTime.Parse("1989-1-11"),
Genre="Romantic Comedy",
Rating="R",
Price=7.99M},
new Movie { Title = "Ghostbusters ",
ReleaseDate=DateTime.Parse("1984-3-13"),
Genre="Comedy",
Rating="R",
Price=8.99M},
new Movie { Title = "Ghostbusters 2",
ReleaseDate=DateTime.Parse("1986-2-23"),
Genre="Comedy",
Rating="R",
Price=9.99M},
new Movie { Title = "Rio Bravo",
ReleaseDate=DateTime.Parse("1959-4-15"),
Genre="Western",
Rating="R",
Price=3.99M},
};
movies.ForEach(d => context.Movies.Add(d));
}
}
}
La MovieInitializer classe specifica che il database utilizzato dal modello deve essere eliminato e ricreato automaticamente se le classi del modello cambiano. Il codice include un Seed metodo per specificare alcuni dati predefiniti da aggiungere automaticamente al database ogni volta che viene creato (o ricreato). In questo modo è possibile popolare il database con alcuni dati di esempio, senza che sia necessario popolarlo manualmente ogni volta che si apporta una modifica al modello.
Dopo aver definito la MovieInitializer classe , è necessario collegarla in modo che ogni volta che l'applicazione venga eseguita, verifica se le classi del modello sono diverse dallo schema nel database. In caso affermativo, è possibile eseguire l'inizializzatore per ricreare il database in modo che corrisponda al modello e quindi popolare il database con i dati di esempio.
Aprire il file Global.asax nella radice del MvcMovies progetto:
Il file Global.asax contiene la classe che definisce l'intera applicazione per il progetto e contiene un Application_Start gestore eventi che viene eseguito al primo avvio dell'applicazione.
Aggiungere due istruzioni using all'inizio del file. Il primo fa riferimento allo spazio dei nomi Entity Framework e il secondo fa riferimento allo spazio dei nomi in cui risiede la MovieInitializer classe:
using System.Data.Entity; // Database.SetInitialize
using MvcMovie.Models; // MovieInitializer
Trovare quindi il Application_Start metodo e aggiungere una chiamata a Database.SetInitializer all'inizio del metodo, come illustrato di seguito:
protected void Application_Start()
{
Database.SetInitializer<MovieDBContext>(new MovieInitializer());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
L'istruzione Database.SetInitializer appena aggiunta indica che il database usato dall'istanza MovieDBContext deve essere eliminato e ricreato automaticamente se lo schema e il database non corrispondono. Come si è visto, popola anche il database con i dati di esempio specificati nella MovieInitializer classe .
Chiudere il file Global.asax .
Eseguire di nuovo l'applicazione e passare all'URL /Movies . All'avvio dell'applicazione, rileva che la struttura del modello non corrisponde più allo schema del database. Crea automaticamente il database in modo che corrisponda alla nuova struttura del modello e popola il database con i film di esempio:

Fare clic sul collegamento Crea nuovo per aggiungere un nuovo film. Si noti che è possibile aggiungere una valutazione.
Cliccare su Crea. Il nuovo film, incluso il rating, ora viene visualizzato nell'elenco dei film:
In questa sezione è stato illustrato come modificare gli oggetti modello e mantenere il database sincronizzato con le modifiche. Si è anche appreso un modo per popolare un database appena creato con dati di esempio in modo da poter provare scenari. Si esaminerà ora come aggiungere logica di convalida più completa alle classi del modello e abilitare alcune regole business da applicare.


