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.
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 VB.NET codice sorgente. Scaricare la versione VB.NET. Se si preferisce C#, passare alla versione C# 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 Property Rating() As String
La classe completa Movie è ora simile al codice seguente:
Public Class Movie
Public Property ID() As Integer
Public Property Title() As String
Public Property ReleaseDate() As Date
Public Property Genre() As String
Public Property Price() As Decimal
Public Property Rating() As String
End Class
Ricompilare l'applicazione usando il comando di menu Debug>compila filmato.
Dopo aver aggiornato la Model classe, è anche necessario aggiornare i modelli di visualizzazione \Views\Movies\Index.vbhtml e \Views\Movies\Create.vbhtml per supportare la nuova Rating proprietà.
Aprire il file\Views\Movies\Index.vbhtml 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.vbhtml aggiornato:
<table>
<tr>
<th> Title </th>
<th> ReleaseDate </th>
<th> Genre </th>
<th> Price </th>
<th>Rating</th>
<th></th>
</tr>
@For Each item In Model
Dim currentItem = item
@<tr>
<td>
@Html.DisplayFor(Function(modelItem) currentItem.Title)
</td>
<td>
@Html.DisplayFor(Function(modelItem) currentItem.ReleaseDate)
</td>
<td>
@Html.DisplayFor(Function(modelItem) currentItem.Genre)
</td>
<td>
@Html.DisplayFor(Function(modelItem) currentItem.Price)
</td>
<td>
@Html.DisplayFor(Function(modelItem) currentItem.Rating)
</td>
<td>
@Html.ActionLink("Edit", "Edit", New With {.id = currentItem.ID}) |
@Html.ActionLink("Details", "Details", New With {.id = currentItem.ID}) |
@Html.ActionLink("Delete", "Delete", New With {.id = currentItem.ID})
</td>
</tr>
Next
</table>
Aprire quindi il file \Views\Movies\Create.vbhtml 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(Function(model) model.Rating)
</div>
<div class="editor-field">
@Html.EditorFor(Function(model) model.Rating)
@Html.ValidationMessageFor(Function(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;
Imports System
Imports System.Collections.Generic
Imports System.Data.Entity
Namespace MvcMovie.Models
Public Class MovieInitializer
Inherits DropCreateDatabaseIfModelChanges(Of MovieDBContext)
Protected Overrides Sub Seed(ByVal context As MovieDBContext)
Dim movies = New List(Of Movie) From {
New Movie With {.Title = "When Harry Met Sally", .ReleaseDate = Date.Parse("1989-1-11"), .Genre = "Romantic Comedy", .Rating = "R", .Price = 7.99D},
New Movie With {.Title = "Ghostbusters ", .ReleaseDate = Date.Parse("1984-3-13"), .Genre = "Comedy", .Rating = "R", .Price = 8.99D},
New Movie With {.Title = "Ghostbusters 2", .ReleaseDate = Date.Parse("1986-2-23"), .Genre = "Comedy", .Rating = "R", .Price = 9.99D},
New Movie With {.Title = "Rio Bravo", .ReleaseDate = Date.Parse("1959-4-15"), .Genre = "Western", .Rating = "R", .Price = 3.99D}}
movies.ForEach(Function(d) context.Movies.Add(d))
End Sub
End Class
End Namespace
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.
Trovare il Application_Start metodo e aggiungere una chiamata a Database.SetInitializer all'inizio del metodo, come illustrato di seguito:
Sub Application_Start()
System.Data.Entity.Database.SetInitializer(Of MovieDBContext)(New MvcMovie.Models.MovieInitializer())
AreaRegistration.RegisterAllAreas()
RegisterGlobalFilters(GlobalFilters.Filters)
RegisterRoutes(RouteTable.Routes)
End Sub
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.
