ASP.NET distribuzione Web con Visual Studio: Preparazione per la distribuzione del database

Scaricare il progetto iniziale

Questa serie di esercitazioni illustra come distribuire (pubblicare) un'applicazione Web ASP.NET in Servizio app di Azure App Web o in un provider di hosting di terze parti usando Visual Studio 2012 o Visual Studio 2010. Per informazioni sulla serie, vedere la prima esercitazione della serie.

Panoramica

Questa esercitazione illustra come preparare il progetto per la distribuzione del database. La struttura del database e alcuni (non tutti) dei dati nei due database dell'applicazione devono essere distribuiti in ambienti di test, staging e produzione.

In genere, quando si sviluppa un'applicazione, si immettono i dati di test in un database che non si vuole distribuire in un sito attivo. È tuttavia possibile che siano presenti anche alcuni dati di produzione da distribuire. In questa esercitazione si configurerà il progetto Contoso University e si prepareranno gli script SQL in modo che i dati corretti vengano inclusi durante la distribuzione.

Promemoria: se viene visualizzato un messaggio di errore o qualcosa che non funziona durante l'esercitazione, assicurarsi di controllare la pagina di risoluzione dei problemi.

SQL Server Express LocalDB

L'applicazione di esempio usa SQL Server Express LocalDB. SQL Server Express è l'edizione gratuita di SQL Server. Viene comunemente usato durante lo sviluppo perché si basa sullo stesso motore di database delle versioni complete di SQL Server. È possibile testare con SQL Server Express e assicurarsi che l'applicazione si comporti nello stesso ambiente di produzione, con alcune eccezioni per le funzionalità che variano tra le edizioni SQL Server.

LocalDB è una modalità di esecuzione speciale di SQL Server Express che consente di usare i database come file con estensione mdf. In genere, i file di database LocalDB vengono conservati nella cartella App_Data di un progetto Web. La funzionalità dell'istanza utente in SQL Server Express consente anche di usare file con estensione mdf, ma la funzionalità dell'istanza utente è deprecata. Pertanto, LocalDB è consigliato per l'uso dei file con estensione mdf.

In genere SQL Server Express non viene usato per le applicazioni Web di produzione. LocalDB in particolare non è consigliato per l'uso di produzione con un'applicazione Web perché non è progettato per funzionare con IIS.

In Visual Studio 2012, LocalDB viene installato per impostazione predefinita con Visual Studio. In Visual Studio 2010 e versioni precedenti, SQL Server Express (senza LocalDB) è installato per impostazione predefinita con Visual Studio. Questo è il motivo per cui è stato installato come uno dei prerequisiti della prima esercitazione di questa serie.

Per altre informazioni sulle edizioni SQL Server, incluso LocalDB, vedere le risorse seguenti Uso di database SQL Server.

Entity Framework e provider universali

Per l'accesso al database, l'applicazione Contoso University richiede il software seguente che deve essere distribuito con l'applicazione perché non è incluso in .NET Framework:

Poiché questo software è incluso nei pacchetti NuGet, il progetto è già configurato in modo che gli assembly necessari vengano distribuiti con il progetto. I collegamenti puntano alle versioni correnti di questi pacchetti, che potrebbero essere più recenti di quelle installate nel progetto iniziale scaricato per questa esercitazione.

Se si esegue la distribuzione in un provider di hosting di terze parti anziché in Azure, assicurarsi di usare Entity Framework 5.0 o versione successiva. Le versioni precedenti di Migrazioni Code First richiedono attendibilità completa e la maggior parte dei provider di hosting eseguirà l'applicazione in attendibilità media. Per altre informazioni sull'attendibilità media, vedere l'esercitazione Distribuire in IIS come ambiente di test .

Configurare Migrazioni Code First per la distribuzione del database dell'applicazione

Il database dell'applicazione Contoso University viene gestito da Code First e lo si distribuirà usando Migrazioni Code First. Per una panoramica della distribuzione del database tramite Migrazioni Code First, vedere la prima esercitazione di questa serie.

Quando si distribuisce un database dell'applicazione, in genere non si distribuisce semplicemente il database di sviluppo con tutti i dati contenuti nell'ambiente di produzione, perché gran parte dei dati in esso contenuti è probabilmente disponibile solo a scopo di test. Ad esempio, i nomi degli studenti in un database di test sono fittizi. D'altra parte, spesso non è possibile distribuire solo la struttura del database senza dati in esso contenuti. Alcuni dati nel database di test potrebbero essere dati reali e devono essere presenti quando gli utenti iniziano a usare l'applicazione. Ad esempio, il database potrebbe avere una tabella contenente valori di grado validi o nomi di reparto reali.

Per simulare questo scenario comune, si configurerà un metodo Migrazioni Code First Seed che inserisce nel database solo i dati da includere nell'ambiente di produzione. Questo Seed metodo non deve inserire dati di test perché verranno eseguiti nell'ambiente di produzione dopo che Code First crea il database nell'ambiente di produzione.

Nelle versioni precedenti di Code First prima del rilascio delle migrazioni, era comune anche per i metodi inserire Seed i dati di test, perché con ogni modifica del modello durante lo sviluppo il database doveva essere completamente eliminato e ricreato da zero. Con Migrazioni Code First, i dati di test vengono conservati dopo la modifica del Seed database, pertanto non è necessario includere i dati di test nel metodo . Il progetto scaricato usa il metodo di inclusione di tutti i dati nel Seed metodo di una classe di inizializzatore. In questa esercitazione si disabiliterà la classe di inizializzatore e si abiliteranno le migrazioni. Si aggiornerà quindi il Seed metodo nella classe di configurazione Migrations in modo che inserisca solo i dati da inserire nell'ambiente di produzione.

Il diagramma seguente illustra lo schema del database dell'applicazione:

School_database_diagram

Per queste esercitazioni si presuppone che le Student tabelle e Enrollment siano vuote quando il sito viene distribuito per la prima volta. Le altre tabelle contengono dati che devono essere precaricati quando l'applicazione diventa attiva.

Disabilitare l'inizializzatore

Poiché si userà Migrazioni Code First, non è necessario usare l'inizializzatore DropCreateDatabaseIfModelChanges Code First. Il codice per questo inizializzatore si trova nel file SchoolInitializer.cs nel progetto ContosoUniversity.DAL. Un'impostazione nell'elemento appSettings del file Web.config causa l'esecuzione di questo inizializzatore ogni volta che l'applicazione tenta di accedere al database per la prima volta:

<appSettings>
  <add key="Environment" value="Dev" />
  <add key="DatabaseInitializerForType ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL" value="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity.DAL" />
</appSettings>

Aprire l'applicazione Web.config file e rimuovere o impostare come commento l'elemento add che specifica la classe inizializzatore Code First. L'elemento appSettings è ora simile al seguente:

<appSettings>
  <add key="Environment" value="Dev" />
</appSettings>

Nota

Un altro modo per specificare una classe di inizializzatore consiste nel chiamare Database.SetInitializer nel Application_Start metodo nel file Global.asax . Se si abilitano le migrazioni in un progetto che usa tale metodo per specificare l'inizializzatore, rimuovere tale riga di codice.

Nota

Se si usa Visual Studio 2013, aggiungere i passaggi seguenti tra i passaggi 2 e 3: (a) In PMC immettere "update-package entityframework -version 6.1.1" per ottenere la versione corrente di EF. Compilare quindi (b) il progetto per ottenere un elenco di errori di compilazione e correggerli. Eliminare le istruzioni using per gli spazi dei nomi che non esistono più, fare clic con il pulsante destro del mouse e scegliere Risolvi per aggiungere istruzioni using in cui sono necessarie e modificare le occorrenze di System.Data.EntityState in System.Data.Entity.EntityState.

Abilitare Migrazioni Code First

  1. Assicurarsi che il progetto ContosoUniversity (non ContosoUniversity.DAL) sia impostato come progetto di avvio. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto ContosoUniversity e scegliere Imposta come progetto di avvio. Migrazioni Code First cercherà nel progetto di avvio per trovare la stringa di connessione del database.

  2. Scegliere Console diGestione pacchetti Di Gestione>pacchetti NuGetdal menu Strumenti.

    Selecting_Package_Manager_Console

  3. Nella parte superiore della finestra Console di Gestione pacchetti selezionare ContosoUniversity.DAL come progetto predefinito e quindi al PM> prompt immettere "enable-migrations".

    Comando enable-migrations

    Se viene visualizzato un errore che indica che il comando enable-migrations non è riconosciuto, immettere il comando EntityFramework -Reinstall e riprovare.

    Questo comando crea una cartella Migrations nel progetto ContosoUniversity.DAL e inserisce nella cartella due file: un file Configuration.cs che è possibile usare per configurare le migrazioni e un file InitialCreate.cs per la prima migrazione che crea il database.

    Cartella Migrations

    È stato selezionato il progetto DAL nell'elenco a discesa Progetto predefinito della console di Gestione pacchetti perché il enable-migrations comando deve essere eseguito nel progetto che contiene la classe di contesto Code First. Quando la classe si trova in un progetto di libreria di classi, Migrazioni Code First cerca la stringa di connessione del database nel progetto di avvio per la soluzione. Nella soluzione ContosoUniversity il progetto Web è stato impostato come progetto di avvio. Se non si vuole designare il progetto con la stringa di connessione come progetto di avvio in Visual Studio, è possibile specificare il progetto di avvio nel comando di PowerShell. Per visualizzare la sintassi del comando, immettere il comando get-help enable-migrations.

    Il enable-migrations comando ha creato automaticamente la prima migrazione perché il database esiste già. Un'alternativa consiste nel creare il database in Migrations. A tale scopo, usare Esplora server o SQL Server Esplora oggetti per eliminare il database ContosoUniversity prima di abilitare le migrazioni. Dopo aver abilitato le migrazioni, creare manualmente la prima migrazione immettendo il comando "Add-migration InitialCreate". È quindi possibile creare il database immettendo il comando "update-database".

Configurare il metodo Seed

Per questa esercitazione si aggiungeranno dati fissi aggiungendo codice al Seed metodo della classe Migrazioni Code FirstConfiguration. Migrazioni Code First chiama il Seed metodo dopo ogni migrazione.

Poiché il Seed metodo viene eseguito dopo ogni migrazione, sono già presenti dati nelle tabelle dopo la prima migrazione. Per gestire questa situazione, si userà il AddOrUpdate metodo per aggiornare le righe già inserite o inserirle se non esistono ancora. Il AddOrUpdate metodo potrebbe non essere la scelta migliore per lo scenario. Per altre informazioni, vedere Il metodo AddOrUpdate di EF 4.3 nel blog di Julie Lerman.

  1. Aprire il file Configuration.cs e sostituire i commenti nel Seed metodo con il codice seguente:

    var instructors = new List<Instructor>
    {   
        new Instructor { FirstMidName = "Kim",     LastName = "Abercrombie", HireDate = DateTime.Parse("1995-03-11"), OfficeAssignment = new OfficeAssignment { Location = "Smith 17" } },
        new Instructor { FirstMidName = "Fadi",    LastName = "Fakhouri",    HireDate = DateTime.Parse("2002-07-06"), OfficeAssignment = new OfficeAssignment { Location = "Gowan 27" } },
        new Instructor { FirstMidName = "Roger",   LastName = "Harui",       HireDate = DateTime.Parse("1998-07-01"), OfficeAssignment = new OfficeAssignment { Location = "Thompson 304" } },
        new Instructor { FirstMidName = "Candace", LastName = "Kapoor",      HireDate = DateTime.Parse("2001-01-15") },
        new Instructor { FirstMidName = "Roger",   LastName = "Zheng",       HireDate = DateTime.Parse("2004-02-12") }
    };
    instructors.ForEach(s => context.Instructors.AddOrUpdate(i => i.LastName, s));
    context.SaveChanges();
    
    var departments = new List<Department>
    {
        new Department { Name = "English",     Budget = 350000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 1 },
        new Department { Name = "Mathematics", Budget = 100000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 2 },
        new Department { Name = "Engineering", Budget = 350000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 3 },
        new Department { Name = "Economics",   Budget = 100000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 4 }
    };
    departments.ForEach(s => context.Departments.AddOrUpdate(d => d.Name, s));
    context.SaveChanges();
    
    var courses = new List<Course>
    {
        new Course { CourseID = 1050, Title = "Chemistry",      Credits = 3, DepartmentID = 3 },
        new Course { CourseID = 4022, Title = "Microeconomics", Credits = 3, DepartmentID = 4 },
        new Course { CourseID = 4041, Title = "Macroeconomics", Credits = 3, DepartmentID = 4 },
        new Course { CourseID = 1045, Title = "Calculus",       Credits = 4, DepartmentID = 2 },
        new Course { CourseID = 3141, Title = "Trigonometry",   Credits = 4, DepartmentID = 2 },
        new Course { CourseID = 2021, Title = "Composition",    Credits = 3, DepartmentID = 1 },
        new Course { CourseID = 2042, Title = "Literature",     Credits = 4, DepartmentID = 1 }
    };
    courses.ForEach(s => context.Courses.AddOrUpdate(s));
    context.SaveChanges();
    
    courses[0].Instructors.Add(instructors[0]);
    courses[0].Instructors.Add(instructors[1]);
    courses[1].Instructors.Add(instructors[2]);
    courses[2].Instructors.Add(instructors[2]);
    courses[3].Instructors.Add(instructors[3]);
    courses[4].Instructors.Add(instructors[3]);
    courses[5].Instructors.Add(instructors[3]);
    courses[6].Instructors.Add(instructors[3]);
    context.SaveChanges();
    
  2. I riferimenti per List avere linee ondulate rosse sotto di esse perché non è ancora disponibile un'istruzione using per il relativo spazio dei nomi. Fare clic con il pulsante destro del mouse su una delle istanze di List e scegliere Risolvi e quindi fare clic su System.Collections.Generic.

    Risolvere con l'istruzione using

    Questa selezione di menu aggiunge il codice seguente alle using istruzioni nella parte superiore del file.

    using System.Collections.Generic;
    
  3. Premere CTRL-MAIUSC-B per compilare il progetto.

Il progetto è ora pronto per distribuire il database ContosoUniversity . Dopo aver distribuito l'applicazione, la prima volta che viene eseguita e passare a una pagina che accede al database, Code First creerà il database ed eseguirà questo Seed metodo.

Nota

L'aggiunta Seed di codice al metodo è uno dei modi in cui è possibile inserire dati fissi nel database. Un'alternativa consiste nell'aggiungere codice ai Up metodi e Down di ogni classe di migrazione. I Up metodi e Down contengono codice che implementa le modifiche del database. Verranno visualizzati esempi nell'esercitazione Distribuzione di un aggiornamento del database .

È anche possibile scrivere codice che esegue istruzioni SQL usando il Sql metodo . Ad esempio, se si aggiunge una colonna Budget alla tabella Department e si desidera inizializzare tutti i budget di reparto a $1.000.00 come parte di una migrazione, è possibile aggiungere la riga di codice seguente al Up metodo per tale migrazione:

Sql("UPDATE Department SET Budget = 1000");

Creare script per la distribuzione del database di appartenenza

L'applicazione Contoso University usa il sistema di appartenenza ASP.NET e l'autenticazione dei moduli per autenticare e autorizzare gli utenti. La pagina Aggiorna crediti è accessibile solo agli utenti che si trovano nel ruolo Amministratore.

Eseguire l'applicazione e fare clic su Corsi e quindi su Aggiorna crediti.

Fare clic su Aggiorna crediti

Viene visualizzata la pagina Log in perché la pagina Aggiorna crediti richiede privilegi amministrativi.

Immettere l'amministratore come nome utente e devpwd come password e fare clic su Accedi.

Pagina Di accesso

Verrà visualizzata la pagina Aggiorna crediti .

Pagina Aggiorna crediti

Le informazioni sull'utente e sul ruolo si trovano nel database aspnet-ContosoUniversity specificato dalla stringa di connessione DefaultConnection nel file Web.config .

Questo database non è gestito da Entity Framework Code First, quindi non è possibile usare le migrazioni per distribuirlo. Si userà il provider dbDacFx per distribuire lo schema del database e si configurerà il profilo di pubblicazione per eseguire uno script che inserisce i dati iniziali nelle tabelle di database.

Nota

È stato introdotto un nuovo sistema di appartenenza ASP.NET (ora denominato ASP.NET Identity) con Visual Studio 2013. Il nuovo sistema consente di mantenere sia le tabelle di applicazione che di appartenenza nello stesso database e è possibile usare Migrazioni Code First per distribuire entrambi. L'applicazione di esempio usa il sistema di appartenenza ASP.NET precedente, che non può essere distribuito usando Migrazioni Code First. Le procedure per la distribuzione di questo database di appartenenza si applicano anche a qualsiasi altro scenario in cui l'applicazione deve distribuire un database SQL Server che non viene creato da Entity Framework Code First.

Anche in questo caso, in genere non si desiderano gli stessi dati nell'ambiente di produzione in uso. Quando si distribuisce un sito per la prima volta, è comune escludere la maggior parte o tutti gli account utente creati per il test. Pertanto, il progetto scaricato ha due database di appartenenza: aspnet-ContosoUniversity.mdf con utenti di sviluppo e aspnet-ContosoUniversity-Prod.mdf con utenti di produzione. Per questa esercitazione i nomi utente sono uguali in entrambi i database: amministratore e nonadmin. Entrambi gli utenti hanno la password devpwd nel database di sviluppo e prodpwd nel database di produzione.

Gli utenti di sviluppo verranno distribuiti nell'ambiente di test e negli utenti di produzione nella gestione temporanea e nella produzione. A tale scopo, si creeranno due script SQL in questa esercitazione, uno per lo sviluppo e uno per la produzione e nelle esercitazioni successive si configurerà il processo di pubblicazione per eseguirli.

Nota

Il database di appartenenza archivia un hash delle password dell'account. Per distribuire gli account da un computer a un altro, è necessario assicurarsi che le routine di hashing non generino hash diversi nel server di destinazione rispetto a quelle eseguite nel computer di origine. Genereranno gli stessi hash quando si usa la provider universali ASP.NET, purché non si modifica l'algoritmo predefinito. L'algoritmo predefinito è HMACSHA256 e viene specificato nell'attributo di convalida dell'elemento machineKey nel file Web.config.

È possibile creare script di distribuzione dei dati manualmente usando SQL Server Management Studio (SSMS) o usando uno strumento di terze parti. Questa esercitazione illustra come eseguire questa operazione in SSMS, ma se non si vuole installare e usare SSMS, è possibile ottenere gli script dalla versione completata del progetto e passare alla sezione in cui vengono archiviati nella cartella della soluzione.

Per installare SSMS, installarlo dall'Area download: Microsoft SQL Server 2012 Express facendo clic su ENU\x64\SQLManagementStudio_x64_ENU.exe o ENU\x86\SQLManagementStudio_x86_ENU.exe. Se si sceglie quello sbagliato per il sistema, non sarà possibile installare e provare l'altro.

Si noti che si tratta di un download di 600 megabyte. Potrebbe richiedere molto tempo per installare e richiederà un riavvio del computer.

Nella prima pagina del Centro installazione SQL Server fare clic su Nuovo SQL Server'installazione autonoma o aggiungere funzionalità a un'installazione esistente e seguire le istruzioni, accettando le scelte predefinite.

Creare lo script del database di sviluppo

  1. Eseguire SSMS.

  2. Nella finestra di dialogo Connetti al server immettere (localdb)\v11.0 come nome server, lasciare l'autenticazione impostata su Autenticazione di Windows e quindi fare clic su Connetti.

    SSMS Connect to Server

  3. Nella finestra Esplora oggetti espandere Database, fare clic con il pulsante destro del mouse su aspnet-ContosoUniversity, scegliere Attività e quindi fare clic su Genera script.

    SSMS Genera script

  4. Nella finestra di dialogo Genera e pubblica script fare clic su Imposta opzioni di scripting.

    È possibile ignorare il passaggio Scegli oggetti perché il valore predefinito è Script intero database e tutti gli oggetti di database ed è ciò che si desidera.

  5. Fare clic su Avanzate.

    Opzioni di scripting di SSMS

  6. Nella finestra di dialogo Opzioni di scripting avanzate scorrere verso il basso fino a Tipi di dati da script e fare clic sull'opzione Solo dati nell'elenco a discesa.

  7. Modificare script USE DATABASE su False. Le istruzioni USE non sono valide per Azure SQL Database e non sono necessarie per la distribuzione in SQL Server Express nell'ambiente di test.

    Solo dati script SSMS, nessuna istruzione USE

  8. Fare clic su OK.

  9. Nella finestra di dialogo Genera e pubblica script , la casella Nome file specifica dove verrà creato lo script. Modificare il percorso della cartella della soluzione (la cartella con il file ContosoUniversity.sln) e il nome del file in aspnet-data-dev.sql.

  10. Fare clic su Avanti per passare alla scheda Riepilogo e quindi fare di nuovo clic su Avanti per creare lo script.

    Script SSMS creato

  11. Fare clic su Fine.

Creare lo script del database di produzione

Poiché non è stato eseguito il progetto con il database di produzione, non è ancora collegato all'istanza di LocalDB. È quindi necessario collegare prima il database.

  1. Nella Esplora oggetti SSMS fare clic con il pulsante destro del mouse su Database e scegliere Collega.

    Collegamento SSMS

  2. Nella finestra di dialogo Collega database fare clic su Aggiungi e quindi passare al file aspnet-ContosoUniversity-Prod.mdf nella cartella App_Data .

    SSMS Aggiungere file mdf per allegare

  3. Fare clic su OK.

  4. Seguire la stessa procedura usata in precedenza per creare uno script per il file di produzione. Assegnare al file di script aspnet-data-prod.sql.

Riepilogo

Entrambi i database sono ora pronti per essere distribuiti e sono disponibili due script di distribuzione dati nella cartella della soluzione.

Script di distribuzione dei dati

Nell'esercitazione seguente si configurano le impostazioni del progetto che influiscono sulla distribuzione e si configurano trasformazioni automaticheWeb.configfile per le impostazioni che devono essere diverse nell'applicazione distribuita.

Altre informazioni

Per altre informazioni su NuGet, vedere Gestire librerie di progetti con NuGet e documentazione di NuGet. Se non si vuole usare NuGet, è necessario imparare a analizzare un pacchetto NuGet per determinare cosa fa quando è installato. Ad esempio, potrebbe configurare trasformazioniWeb.config , configurare gli script di PowerShell da eseguire in fase di compilazione e così via. Per altre informazioni sul funzionamento di NuGet, vedere Creazione e pubblicazione di un pacchetto e trasformazioni di file di configurazione e codice sorgente.