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.
di Tom Dykstra
L'applicazione Web di esempio Contoso University illustra come creare ASP.NET applicazioni MVC 4 usando Entity Framework 5 Code First e Visual Studio 2012. Per informazioni sulla serie di esercitazioni, vedere la prima esercitazione della serie.
Nota
Se si verifica un problema che non è possibile risolvere, scaricare il capitolo completato e provare a riprodurre il problema. In genere è possibile trovare la soluzione al problema confrontando il codice con il codice completato. Per alcuni errori comuni e come risolverli, vedere Errori e soluzioni alternative.
Nell'esercitazione precedente è stato implementato un set di pagine Web per operazioni CRUD di base per Student
le entità. In questa esercitazione si aggiungeranno funzionalità di ordinamento, filtro e paging alla pagina Indice studenti . Verrà anche creata una pagina che esegue il raggruppamento semplice.
La figura seguente illustra l'aspetto della pagina al termine dell'operazione. Le intestazioni di colonna sono collegamenti su cui l'utente può fare clic per eseguire l'ordinamento in base alla colonna. Facendo clic più volte su un'intestazione di colonna è possibile passare dall'ordinamento crescente a quello decrescente e viceversa.
Aggiungere collegamenti per l'ordinamento di colonna alla pagina Student Index (Indice degli studenti)
Per aggiungere l'ordinamento alla pagina Student Index, si modificherà il metodo del Student
controller e si aggiungerà il Index
codice alla Student
visualizzazione Index.
Aggiungere la funzionalità di ordinamento al metodo Index
In Controllers\StudentController.cs sostituire il Index
metodo con il codice seguente:
public ActionResult Index(string sortOrder)
{
ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "Name_desc" : "";
ViewBag.DateSortParm = sortOrder == "Date" ? "Date_desc" : "Date";
var students = from s in db.Students
select s;
switch (sortOrder)
{
case "Name_desc":
students = students.OrderByDescending(s => s.LastName);
break;
case "Date":
students = students.OrderBy(s => s.EnrollmentDate);
break;
case "Date_desc":
students = students.OrderByDescending(s => s.EnrollmentDate);
break;
default:
students = students.OrderBy(s => s.LastName);
break;
}
return View(students.ToList());
}
Questo codice riceve un parametro sortOrder
dalla stringa di query nell'URL. Il valore della stringa di query viene fornito da ASP.NET MVC come parametro per il metodo action. Il parametro sarà una stringa "Name" o "Date", seguito facoltativamente da un carattere di sottolineatura e dalla stringa "desc" per specificare l'ordine decrescente. Per impostazione predefinita, l'ordinamento è crescente.
La prima volta che viene richiesta la pagina di indice, non è presente alcuna stringa di query. Gli studenti vengono visualizzati in ordine crescente in base LastName
a , ovvero il valore predefinito stabilito dal caso di fall-through nell'istruzione switch
. Quando l'utente fa clic sul collegamento ipertestuale di un'intestazione di colonna, nella stringa di query viene specificato il valore sortOrder
appropriato.
Le due ViewBag
variabili vengono usate in modo che la vista possa configurare i collegamenti ipertestuali dell'intestazione di colonna con i valori della stringa di query appropriati:
ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "Name_desc" : "";
ViewBag.DateSortParm = sortOrder == "Date" ? "Date_desc" : "Date";
Si tratta di istruzioni ternarie. Il primo specifica che se il sortOrder
parametro è Null o vuoto, ViewBag.NameSortParm
deve essere impostato su "name_desc". In caso contrario, deve essere impostato su una stringa vuota. Queste due istruzioni consentono alla visualizzazione di impostare i collegamenti ipertestuali dell'intestazione di colonna come indicato di seguito:
Ordinamento corrente | Collegamento ipertestuale cognome | Collegamento ipertestuale data |
---|---|---|
Cognome in ordine crescente | descending | ascending |
Cognome in ordine decrescente | ascending | ascending |
Data in ordine crescente | ascending | descending |
Data in ordine decrescente | ascending | ascending |
Il metodo usa LINQ to Entities per specificare la colonna in base alla quale eseguire l'ordinamento. Il codice crea una variabile IQueryable prima dell'istruzione switch
, la modifica nell'istruzione switch
e chiama il ToList
metodo dopo l'istruzione switch
. Quando si creano e modificano variabili IQueryable
, nessuna query viene inviata al database. La query non viene eseguita fino a quando non si converte l'oggetto IQueryable
in una raccolta chiamando un metodo come ToList
. Di conseguenza, questo codice genera una singola query che non viene eseguita fino all'istruzione return View
.
Aggiungere collegamenti ipertestuali intestazione di colonna alla visualizzazione Indice degli studenti
In Views\Student\Index.cshtml sostituire gli <tr>
elementi e <th>
per la riga di intestazione con il codice evidenziato:
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th>
@Html.ActionLink("Last Name", "Index", new { sortOrder = ViewBag.NameSortParm })
</th>
<th>First Name
</th>
<th>
@Html.ActionLink("Enrollment Date", "Index", new { sortOrder = ViewBag.DateSortParm })
</th>
<th></th>
</tr>
@foreach (var item in Model)
{
Questo codice usa le informazioni nelle ViewBag
proprietà per configurare i collegamenti ipertestuali con i valori della stringa di query appropriati.
Eseguire la pagina e fare clic sulle intestazioni di colonna Cognome e Data di registrazione per verificare che l'ordinamento funzioni.
Dopo aver fatto clic sull'intestazione Cognome , gli studenti vengono visualizzati in ordine decrescente del cognome.
Aggiungere una casella di ricerca alla pagina Indice studenti
Per aggiungere filtri alla pagina Student Index (Indice degli studenti), è necessario aggiungere alla visualizzazione una casella di testo e un pulsante di invio e apportare le modifiche corrispondenti nel metodo Index
. La casella di testo consente di immettere una stringa per eseguire la ricerca nei campi di nome e cognome.
Aggiungere la funzionalità di filtro al metodo Index
In Controllers\StudentController.cs sostituire il Index
metodo con il codice seguente (le modifiche sono evidenziate):
public ViewResult Index(string sortOrder, string searchString)
{
ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";
var students = from s in db.Students
select s;
if (!String.IsNullOrEmpty(searchString))
{
students = students.Where(s => s.LastName.ToUpper().Contains(searchString.ToUpper())
|| s.FirstMidName.ToUpper().Contains(searchString.ToUpper()));
}
switch (sortOrder)
{
case "name_desc":
students = students.OrderByDescending(s => s.LastName);
break;
case "Date":
students = students.OrderBy(s => s.EnrollmentDate);
break;
case "date_desc":
students = students.OrderByDescending(s => s.EnrollmentDate);
break;
default:
students = students.OrderBy(s => s.LastName);
break;
}
return View(students.ToList());
}
È stato aggiunto un parametro searchString
al metodo Index
. È stata aggiunta anche all'istruzione LINQ una where
clausola che seleziona solo studenti il cui nome o cognome contiene la stringa di ricerca. Il valore della stringa di ricerca viene ricevuto da una casella di testo che verrà aggiunta alla visualizzazione Indice. L'istruzione che aggiunge la clausola where viene eseguita solo se è presente un valore da cercare.
Nota
In molti casi è possibile chiamare lo stesso metodo su un set di entità di Entity Framework o come metodo di estensione in una raccolta in memoria. I risultati sono in genere uguali, ma in alcuni casi possono essere diversi. Ad esempio, l'implementazione di .NET Framework del Contains
metodo restituisce tutte le righe quando si passa una stringa vuota, ma il provider Entity Framework per SQL Server Compact 4.0 restituisce zero righe per stringhe vuote. Pertanto, il codice nell'esempio (inserendo l'istruzione Where
all'interno di un'istruzioneif
) garantisce di ottenere gli stessi risultati per tutte le versioni di SQL Server. Inoltre, l'implementazione di .NET Framework del Contains
metodo esegue un confronto con distinzione tra maiuscole e minuscole per impostazione predefinita, ma i provider di Entity Framework SQL Server eseguono confronti senza distinzione tra maiuscole e minuscole per impostazione predefinita. Pertanto, la chiamata al ToUpper
metodo per rendere il test senza distinzione tra maiuscole e minuscole garantisce che i risultati non vengano modificati quando si modifica il codice in un secondo momento per usare un repository, che restituirà una IEnumerable
raccolta anziché un IQueryable
oggetto . Quando il metodo Contains
viene chiamato su una raccolta IEnumerable
, si ottiene l'implementazione di .NET Framework; quando viene chiamato su un oggetto IQueryable
, si ottiene l'implementazione del provider di database.
Aggiungere una casella di ricerca alla visualizzazione Student Index (Indice degli studenti)
In Views\Student\Index.cshtml aggiungere il codice evidenziato immediatamente prima del tag di apertura table
per creare un didascalia, una casella di testo e un pulsante Cerca.
<p>
@Html.ActionLink("Create New", "Create")
</p>
@using (Html.BeginForm())
{
<p>
Find by name: @Html.TextBox("SearchString")
<input type="submit" value="Search" /></p>
}
<table>
<tr>
Eseguire la pagina, immettere una stringa di ricerca e fare clic su Cerca per verificare che il filtro funzioni.
Si noti che l'URL non contiene la stringa di ricerca "an", il che significa che se si segnalibra questa pagina, non si otterrà l'elenco filtrato quando si usa il segnalibro. Il pulsante Cerca verrà modificato per usare le stringhe di query per i criteri di filtro più avanti nell'esercitazione.
Aggiungere il paging alla pagina Indice studenti
Per aggiungere il paging alla pagina Students Index, si inizierà installando il pacchetto NuGet PagedList.Mvc . Si modificheranno quindi altre modifiche nel Index
metodo e si aggiungeranno collegamenti di paging alla Index
visualizzazione.
PagedList.Mvc è uno dei numerosi pacchetti di paging e ordinamento validi per ASP.NET MVC e l'uso qui è previsto solo come esempio, non come raccomandazione per esso rispetto ad altre opzioni. La figura seguente mostra i collegamenti di paging.
Installare il pacchetto NuGet PagedList.MVC
Il pacchetto NuGet PagedList.Mvc installa automaticamente il pacchetto PagedList come dipendenza. Il pacchetto PagedList installa un PagedList
tipo di raccolta e metodi di estensione per IQueryable
le raccolte e IEnumerable
. I metodi di estensione creano una singola pagina di dati in una PagedList
raccolta all'esterno di IQueryable
o IEnumerable
e la raccolta fornisce diverse proprietà e metodi che facilitano il PagedList
paging. Il pacchetto PagedList.Mvc installa un helper di paging che visualizza i pulsanti di paging.
Dal menu Strumenti selezionare Gestione pacchetti NuGet e quindi Gestisci pacchetti NuGet per la soluzione.
Nella finestra di dialogo Gestisci pacchetti NuGet fare clic sulla scheda Online a sinistra e quindi immettere "paged" nella casella di ricerca. Quando viene visualizzato il pacchetto PagedList.Mvc , fare clic su Installa.
Nella casella Seleziona progetti fare clic su OK.
Aggiungere funzionalità di paging al metodo Index
In Controller\StudentController.cs aggiungere un'istruzione using
per lo PagedList
spazio dei nomi:
using PagedList;
Sostituire il metodo Index
con il codice seguente:
public ViewResult Index(string sortOrder, string currentFilter, string searchString, int? page)
{
ViewBag.CurrentSort = sortOrder;
ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";
if (searchString != null)
{
page = 1;
}
else
{
searchString = currentFilter;
}
ViewBag.CurrentFilter = searchString;
var students = from s in db.Students
select s;
if (!String.IsNullOrEmpty(searchString))
{
students = students.Where(s => s.LastName.ToUpper().Contains(searchString.ToUpper())
|| s.FirstMidName.ToUpper().Contains(searchString.ToUpper()));
}
switch (sortOrder)
{
case "name_desc":
students = students.OrderByDescending(s => s.LastName);
break;
case "Date":
students = students.OrderBy(s => s.EnrollmentDate);
break;
case "date_desc":
students = students.OrderByDescending(s => s.EnrollmentDate);
break;
default: // Name ascending
students = students.OrderBy(s => s.LastName);
break;
}
int pageSize = 3;
int pageNumber = (page ?? 1);
return View(students.ToPagedList(pageNumber, pageSize));
}
Questo codice aggiunge un parametro, un page
parametro di ordinamento corrente e un parametro di filtro corrente alla firma del metodo, come illustrato di seguito:
public ActionResult Index(string sortOrder, string currentFilter, string searchString, int? page)
La prima volta che viene visualizzata la pagina o se l'utente non ha selezionato un collegamento di suddivisione in pagine o di ordinamento, tutti i parametri saranno Null. Se viene fatto clic su un collegamento di paging, la variabile conterrà il page
numero di pagina da visualizzare.
A ViewBag
la proprietà fornisce la visualizzazione con l'ordine di ordinamento corrente, perché deve essere inclusa nei collegamenti di paging per mantenere lo stesso ordine di ordinamento durante il paging:
ViewBag.CurrentSort = sortOrder;
Un'altra proprietà, ViewBag.CurrentFilter
, fornisce la visualizzazione con la stringa di filtro corrente. Questo valore deve essere incluso nei collegamenti di suddivisione in pagine per mantenere le impostazioni di filtro nella suddivisione in pagine e deve essere ripristinato nella casella di testo quando la pagina viene nuovamente visualizzata. Se la stringa di ricerca viene modificata nella suddivisione in pagine, la pagina deve essere reimpostata su 1, poiché il nuovo filtro può comportare la visualizzazione di dati diversi. La stringa di ricerca viene modificata quando viene immesso un valore nella casella di testo e viene premuto il pulsante invia. In questo caso, il searchString
parametro non è Null.
if (searchString != null)
page = 1;
else
searchString = currentFilter;
Alla fine del metodo, il ToPagedList
metodo di estensione nell'oggetto studenti converte la query degli studenti in una singola pagina di studenti IQueryable
in un tipo di raccolta che supporta il paging. Tale singola pagina degli studenti viene quindi passata alla visualizzazione:
int pageSize = 3;
int pageNumber = (page ?? 1);
return View(students.ToPagedList(pageNumber, pageSize));
Il metodo ToPagedList
accetta un numero di pagina. I due punti interrogativi rappresentano l'operatore null-coalescing. L'operatore null-coalescing definisce un valore predefinito per un tipo nullable. L'espressione (page ?? 1)
significa restituzione del valore di page
se ha un valore oppure restituzione di 1 se page
è Null.
Aggiungere collegamenti di paging alla visualizzazione indice degli studenti
In Views\Student\Index.cshtml sostituire il codice esistente con il codice seguente:
@model PagedList.IPagedList<ContosoUniversity.Models.Student>
@using PagedList.Mvc;
<link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" />
@{
ViewBag.Title = "Students";
}
<h2>Students</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
@using (Html.BeginForm("Index", "Student", FormMethod.Get))
{
<p>
Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
<input type="submit" value="Search" />
</p>
}
<table>
<tr>
<th></th>
<th>
@Html.ActionLink("Last Name", "Index", new { sortOrder=ViewBag.NameSortParm, currentFilter=ViewBag.CurrentFilter })
</th>
<th>
First Name
</th>
<th>
@Html.ActionLink("Enrollment Date", "Index", new { sortOrder = ViewBag.DateSortParm, currentFilter = ViewBag.CurrentFilter })
</th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.StudentID }) |
@Html.ActionLink("Details", "Details", new { id=item.StudentID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.StudentID })
</td>
<td>
@Html.DisplayFor(modelItem => item.LastName)
</td>
<td>
@Html.DisplayFor(modelItem => item.FirstMidName)
</td>
<td>
@Html.DisplayFor(modelItem => item.EnrollmentDate)
</td>
</tr>
}
</table>
<br />
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount
@Html.PagedListPager( Model, page => Url.Action("Index", new { page, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter }) )
L'istruzione @model
nella parte superiore della pagina specifica che la vista ottiene ora un oggetto PagedList
anziché un oggetto List
.
L'istruzione using
per PagedList.Mvc
consente l'accesso all'helper MVC per i pulsanti di paging.
Il codice usa un overload di BeginForm che consente di specificare FormMethod.Get.
@using (Html.BeginForm("Index", "Student", FormMethod.Get))
{
<p>
Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
<input type="submit" value="Search" />
</p>
}
Il formato BeginForm predefinito invia i dati del modulo con un POST, il che significa che i parametri vengono passati nel corpo del messaggio HTTP e non nell'URL come stringhe di query. Quando si specifica HTTP GET, i dati del modulo vengono passati nell'URL come stringhe di query, il che consente agli utenti di inserire l'URL tra i segnalibri. Le linee guida W3C per l'uso di HTTP GET specificano che è consigliabile usare GET quando l'azione non genera un aggiornamento.
La casella di testo viene inizializzata con la stringa di ricerca corrente, quindi quando si fa clic su una nuova pagina è possibile visualizzare la stringa di ricerca corrente.
Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
I collegamenti delle intestazioni di colonna usano la stringa di query per passare la stringa di ricerca corrente al controller in modo che l'utente possa procedere all'ordinamento all'interno dei risultati di filtro:
@Html.ActionLink("Last Name", "Index", new { sortOrder=ViewBag.NameSortParm, currentFilter=ViewBag.CurrentFilter })
Viene visualizzata la pagina corrente e il numero totale di pagine.
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount
Se non sono visualizzate pagine, viene visualizzata "Pagina 0 di 0". In tal caso il numero di pagina è maggiore del numero di pagine perché Model.PageNumber
è 1 e Model.PageCount
è 0.
I pulsanti di paging vengono visualizzati dal PagedListPager
helper:
@Html.PagedListPager( Model, page => Url.Action("Index", new { page }) )
L'helper PagedListPager
offre una serie di opzioni che è possibile personalizzare, inclusi GLI URL e lo stile. Per altre informazioni, vedere TroyGoode/PagedList nel sito GitHub.
Eseguire la pagina.
Fare clic sui collegamenti di suddivisione in pagine in diversi tipi di ordinamento per verificare che la suddivisione in pagine funzioni. Immettere quindi una stringa di ricerca e provare nuovamente la suddivisione in pagine per verificare che funzioni correttamente anche con l'ordinamento e il filtro.
Creare una pagina Informazioni che mostra le statistiche degli studenti
Per la pagina About (Informazioni) del sito Web Contoso University verrà visualizzato il numero di studenti iscritti per ogni data di iscrizione. Questa operazione richiede calcoli di raggruppamento e semplici sui gruppi. Per completare questa procedura, è necessario eseguire le operazioni seguenti:
- Creare una classe modello di visualizzazione per i dati che è necessario passare alla visualizzazione.
- Modificare il
About
metodo nelHome
controller. - Modificare la
About
visualizzazione.
Creare il modello di visualizzazione
Creare una cartella ViewModels . In tale cartella aggiungere un file di classe EnrollmentDateGroup.cs e sostituire il codice esistente con il codice seguente:
using System;
using System.ComponentModel.DataAnnotations;
namespace ContosoUniversity.ViewModels
{
public class EnrollmentDateGroup
{
[DataType(DataType.Date)]
public DateTime? EnrollmentDate { get; set; }
public int StudentCount { get; set; }
}
}
Modificare il controller Home
In HomeController.cs aggiungere le istruzioni seguenti using
nella parte superiore del file:
using ContosoUniversity.DAL;
using ContosoUniversity.ViewModels;
Aggiungere una variabile di classe per il contesto di database immediatamente dopo la parentesi graffe di apertura per la classe:
public class HomeController : Controller
{
private SchoolContext db = new SchoolContext();
Sostituire il metodo About
con il codice seguente:
public ActionResult About()
{
var data = from student in db.Students
group student by student.EnrollmentDate into dateGroup
select new EnrollmentDateGroup()
{
EnrollmentDate = dateGroup.Key,
StudentCount = dateGroup.Count()
};
return View(data);
}
L'istruzione LINQ raggruppa le entità di studenti per data di registrazione, calcola il numero di entità in ogni gruppo e archivia i risultati in una raccolta di oggetti di modello della visualizzazione EnrollmentDateGroup
.
Aggiungere un Dispose
metodo:
protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
Modificare la visualizzazione della pagina About (Informazioni)
Sostituire il codice nel file Views\Home\About.cshtml con il codice seguente:
@model IEnumerable<ContosoUniversity.ViewModels.EnrollmentDateGroup>
@{
ViewBag.Title = "Student Body Statistics";
}
<h2>Student Body Statistics</h2>
<table>
<tr>
<th>
Enrollment Date
</th>
<th>
Students
</th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.EnrollmentDate)
</td>
<td>
@item.StudentCount
</td>
</tr>
}
</table>
Eseguire l'app e fare clic sul collegamento Informazioni . Il numero di studenti per ogni data di registrazione viene visualizzato in una tabella.
Facoltativo: Distribuire l'app in Windows Azure
Finora l'applicazione è in esecuzione in locale in IIS Express nel computer di sviluppo. Per renderlo disponibile per altre persone da usare su Internet, è necessario distribuirlo in un provider di hosting Web. In questa sezione facoltativa dell'esercitazione verrà distribuita in un sito Web di Windows Azure.
Uso di Migrazioni Code First per distribuire il database
Per distribuire il database che si userà Migrazioni Code First. Quando si crea il profilo di pubblicazione usato per configurare le impostazioni per la distribuzione da Visual Studio, si seleziona una casella di controllo con etichetta Esegui Migrazioni Code First (eseguita all'avvio dell'applicazione). Questa impostazione determina che il processo di distribuzione configura automaticamente il file dell'applicazione Web.config nel server di destinazione in modo che Code First usi la MigrateDatabaseToLatestVersion
classe inizializzatore.
Visual Studio non esegue alcuna operazione con il database durante il processo di distribuzione. Quando l'applicazione distribuita accede al database per la prima volta dopo la distribuzione, Code First crea automaticamente il database o aggiorna lo schema del database alla versione più recente. Se l'applicazione implementa un metodo Migrations Seed
, il metodo viene eseguito dopo la creazione del database o lo schema viene aggiornato.
Il metodo Migrations inserisce Seed
i dati di test. Se si esegue la distribuzione in un ambiente di produzione, è necessario modificare il Seed
metodo in modo che inserisca solo i dati da inserire nel database di produzione. Ad esempio, nel modello di dati corrente potrebbe essere necessario avere corsi reali, ma studenti fittizi nel database di sviluppo. È possibile scrivere un Seed
metodo per caricare entrambi nello sviluppo e quindi commentare gli studenti fittizi prima di eseguire la distribuzione in produzione. Oppure è possibile scrivere un Seed
metodo per caricare solo i corsi e immettere manualmente gli studenti fittizi nel database di test usando l'interfaccia utente dell'applicazione.
Ottenere un account Windows Azure
Sarà necessario un account Windows Azure. Se non ne hai già uno, puoi creare un account di valutazione gratuito in pochi minuti. Per i dettagli, vedere Versione di valutazione gratuita.
Creare un sito Web e un database SQL in Windows Azure
Il sito Web di Windows Azure verrà eseguito in un ambiente di hosting condiviso, che significa che viene eseguito in macchine virtuali (VM) condivise con altri client di Windows Azure. Un ambiente di hosting condiviso è un punto di partenza economicamente conveniente per iniziare a utilizzare il cloud. In seguito, in caso di incremento del traffico Web, è possibile scalare l'applicazione in modo da soddisfare le nuove esigenze tramite l'esecuzione su macchine virtuali dedicate. Se è necessaria un'architettura più complessa, è possibile eseguire la migrazione a un servizio cloud di Windows Azure. I servizi cloud vengono eseguiti su macchine virtuali dedicate, che possono essere configurate in base alle proprie esigenze specifiche.
Windows Azure SQL Database è un servizio di database relazionale basato sul cloud basato su cloud basato su tecnologie di SQL Server. Strumenti e applicazioni che funzionano con SQL Server funzionano anche con database SQL.
Nel portale di gestione di Windows Azure fare clic su Siti Web nella scheda sinistra e quindi fare clic su Nuovo.
Fare clic su CREATE PERSONALIZZATO.
Verrà visualizzata la creazione guidata Nuovo sito Web - Creazione personalizzata .
Nel passaggio Nuovo sito Web della procedura guidata immettere una stringa nella casella URL da usare come URL univoco per l'applicazione. L'URL completo sarà costituito da quanto immesso in questa casella e dal suffisso visualizzato accanto alla casella di testo. La figura mostra "ConU", ma probabilmente l'URL viene preso in modo da dover scegliere uno diverso.
Nell'elenco a discesa Area scegliere un'area vicina all'utente. Questa impostazione specifica il data center in cui verrà eseguito il sito Web.
Nell'elenco a discesa Database scegliere Crea un database SQL gratuito di 20 MB.
In DB CONNECTION STRING NAME (NOME STRINGA DI CONNESSIONE DB) immettere SchoolContext.
Fare clic sulla freccia che punta a destra nella parte inferiore della casella. La procedura guidata passa al passaggio Impostazioni database .
Nella casella Nome immettere ContosoUniversityDB.
Nella casella Server selezionare Nuovo database SQL server. In alternativa, se in precedenza è stato creato un server, è possibile selezionare tale server dall'elenco a discesa.
Immettere un nome di accesso amministratore e una PASSWORD. Se è stata selezionata l'opzione Nuovo server di database SQL, in questo passaggio non sarà necessario immettere un nome e una password esistenti, ma un nuovo nome e una nuova password, definiti ora e da utilizzare in seguito per l'accesso al database. Se è stato selezionato un server creato in precedenza, immettere le credenziali per tale server. Per questa esercitazione non verrà selezionata la casella di controllo Avanzate . Le opzioni Avanzate consentono di impostare le regole di confronto del database.
Scegliere la stessa area scelta per il sito Web.
Fare clic sul segno di spunta nella parte inferiore destra della casella per indicare che è stato completato.
L'immagine seguente mostra l'uso di un SQL Server esistente e di un account di accesso.
Il portale di gestione torna alla pagina Siti Web e la colonna Stato indica che il sito viene creato. Dopo un po' (in genere meno di un minuto), la colonna Stato indica che il sito è stato creato correttamente. Nella barra di spostamento a sinistra viene visualizzato il numero di siti presenti nell'account accanto all'icona Siti Web e il numero di database viene visualizzato accanto all'icona Database SQL .
Distribuire l'applicazione in Windows Azure
In Visual Studio fare clic con il pulsante destro del mouse sul progetto in Esplora soluzioni e scegliere Pubblica dal menu di scelta rapida.
Nella scheda Profilo della pubblicazione guidata Web fare clic su Importa.
Se la sottoscrizione di Windows Azure non è stata aggiunta in precedenza in Visual Studio, seguire questa procedura. In questi passaggi si aggiunge la sottoscrizione in modo che l'elenco a discesa in Importa da un sito Web di Windows Azure includa il sito Web.
a. Nella finestra di dialogo Importa profilo di pubblicazione fare clic su Importa da un sito Web di Windows Azure e quindi su Aggiungi sottoscrizione di Windows Azure.
b. Nella finestra di dialogo Importa sottoscrizioni di Windows Azure fare clic su Scarica file di sottoscrizione.
c. Nella finestra del browser salvare il file con estensione publishsettings .
Avviso
Sicurezza: il file publishsettings contiene le credenziali (non codificate) usate per amministrare le sottoscrizioni e i servizi di Windows Azure. La procedura consigliata per la sicurezza per questo file consiste nell'archiviarla temporaneamente all'esterno delle directory di origine (ad esempio nella cartella Libraries\Documents ) e quindi eliminarla al termine dell'importazione. Un utente malintenzionato che ottiene l'accesso al
.publishsettings
file può modificare, creare ed eliminare i servizi di Windows Azure.d. Nella finestra di dialogo Importa sottoscrizioni di Windows Azure fare clic su Sfoglia e passare al file con estensione publishsettings .
e. Fare clic su Importa.
Nella finestra di dialogo Importa profilo di pubblicazione selezionare Importa da un sito Web di Windows Azure, selezionare il sito Web dall'elenco a discesa e quindi fare clic su OK.
Nella scheda Connessione fare clic su Convalida connessione per verificare che le impostazioni siano corrette.
Quando la connessione è stata convalidata, accanto al pulsante Convalida connessione viene visualizzato un segno di spunta verde. Fare clic su Avanti.
Aprire l'elenco a discesa Stringa di connessione remota in SchoolContext e selezionare la stringa di connessione per il database creato.
Selezionare Esegui Migrazioni Code First (in esecuzione all'avvio dell'applicazione).
Deselezionare Usa questa stringa di connessione in fase di esecuzione per UserContext (DefaultConnection), perché l'applicazione non usa il database di appartenenza.
Fare clic su Avanti.
Nella scheda Anteprima fare clic su Avvia anteprima.
Nella scheda viene visualizzato un elenco dei file che verranno copiati nel server. La visualizzazione dell'anteprima non è necessaria per pubblicare l'applicazione, ma è una funzione utile da tenere presente. In questo caso, non è necessario eseguire alcuna operazione con l'elenco di file visualizzati. La volta successiva che si distribuisce questa applicazione, solo i file che sono stati modificati saranno inclusi in questo elenco.
Fare clic su Pubblica.
Visual Studio avvia il processo di copia dei file nel server di Windows Azure.Nella finestra Output vengono indicate le azioni di distribuzione effettuate e viene segnalato il corretto completamento della distribuzione.
Al termine della distribuzione, il browser predefinito si apre automaticamente all'URL del sito Web distribuito.
L'applicazione creata verrà ora eseguita nel cloud. Fare clic sulla scheda Studenti.
A questo punto il database SchoolContext è stato creato nel database di Windows Azure SQL perché è stata selezionata l'opzione Esegui Migrazioni Code First (in esecuzione all'avvio dell'app). Il fileWeb.config nel sito Web distribuito è stato modificato in modo che l'inizializzatore MigrateDatabaseToLatestVersion venga eseguito la prima volta che il codice legge o scrive i dati nel database , che si è verificato quando è stata selezionata la scheda Studenti :
Il processo di distribuzione ha anche creato una nuova stringa di connessione (SchoolContext_DatabasePublish) per Migrazioni Code First da usare per aggiornare lo schema del database e il seeding del database.
La stringa di connessione DefaultConnection è relativa al database di appartenenza , che non viene usato in questa esercitazione. La stringa di connessione SchoolContext è relativa al database ContosoUniversity.
È possibile trovare la versione distribuita del file di Web.config nel proprio computer in ContosoUniversity\obj\Release\Package\PackageTmp\Web.config. È possibile accedere al file Web.config distribuito tramite FTP. Per istruzioni, vedere ASP.NET distribuzione Web con Visual Studio: Distribuzione di un aggiornamento del codice. Seguire le istruzioni che iniziano con "Per usare uno strumento FTP, sono necessari tre elementi: l'URL FTP, il nome utente e la password".
Nota
L'app Web non implementa la sicurezza, quindi chiunque trovi l'URL può modificare i dati. Per istruzioni su come proteggere il sito Web, vedere Distribuire un'app MVC ASP.NET sicura con appartenenza, OAuth e database SQL a un sito Web di Windows Azure. È possibile impedire ad altri utenti di usare il sito usando il portale di gestione di Windows Azure o Esplora server in Visual Studio per arrestare il sito.
Inizializzatori Code First
Nella sezione relativa alla distribuzione è stato visualizzato l'inizializzatore MigrateDatabaseToLatestVersion in uso. Code First fornisce anche altri inizializzatori che è possibile usare, tra cui CreateDatabaseIfNotExists (impostazione predefinita), DropCreateDatabaseIfModelChanges e DropCreateDatabaseAlways. L'inizializzatore DropCreateAlways
può essere utile per configurare le condizioni per gli unit test. È anche possibile scrivere inizializzatori personalizzati ed è possibile chiamare un inizializzatore in modo esplicito se non si vuole attendere fino a quando l'applicazione non legge o scrive nel database. Per una spiegazione completa degli inizializzatori, vedere il capitolo 6 del libro Programming Entity Framework: Code First di Julie Lerman e Rowan Miller.
Riepilogo
In questa esercitazione è stato illustrato come creare un modello di dati e implementare funzionalità crud, ordinamento, filtro, paging e raggruppamento di base. Nell'esercitazione successiva si inizierà a esaminare argomenti più avanzati espandendo il modello di dati.
I collegamenti ad altre risorse di Entity Framework sono disponibili nella mappa del contenuto ASP.NET accesso ai dati.