Condividi tramite


Distribuzione di un'applicazione Web ASP.NET con SQL Server Compact tramite Visual Studio o Visual Web Developer: Distribuzione di database SQL Server Compact - 2 di 12

di Tom Dykstra

Scaricare il progetto iniziale

Questa serie di esercitazioni illustra come distribuire (pubblicare) un progetto di applicazione Web ASP.NET che include un database SQL Server Compact usando Visual Studio 2012 RC o Visual Studio Express 2012 RC per Web. È anche possibile usare Visual Studio 2010 se si installa l'aggiornamento pubblicazione Web. Per un'introduzione alla serie, vedere la prima esercitazione nella serie.

Per un'esercitazione che illustra le funzionalità di distribuzione introdotte dopo la versione RC di Visual Studio 2012, viene illustrato come distribuire edizioni SQL Server diverse da SQL Server Compact e viene illustrato come eseguire la distribuzione in Servizio app di Azure App Web, vedere ASP.NET distribuzione Web con Visual Studio.

Panoramica

Questa esercitazione illustra come configurare due database SQL Server Compact e il motore di database per la distribuzione.

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:

La struttura del database e alcuni (non tutti) dei dati nei due database dell'applicazione devono essere distribuiti anche. In genere, durante lo sviluppo di un'applicazione, immettere i dati di test in un database che non si vuole distribuire in un sito live. Tuttavia, è anche possibile immettere alcuni dati di produzione da distribuire. In questa esercitazione verrà configurato il progetto Contoso University in modo che il software necessario e 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 Compact e SQL Server Express

L'applicazione di esempio usa SQL Server Compact 4.0. Questo motore di database è un'opzione relativamente nuova per i siti Web; le versioni precedenti di SQL Server Compact non funzionano in un ambiente di hosting Web. SQL Server Compact offre alcuni vantaggi rispetto allo scenario più comune di sviluppo con SQL Server Express e distribuzione in SQL Server completo. A seconda del provider di hosting scelto, SQL Server Compact potrebbe essere più economico per la distribuzione, perché alcuni provider caricano extra per supportare un database completo SQL Server. Non è previsto alcun costo aggiuntivo per SQL Server Compact perché è possibile distribuire il motore di database stesso come parte dell'applicazione Web.

Tuttavia, è necessario tenere presente anche le relative limitazioni. SQL Server Compact non supporta stored procedure, trigger, visualizzazioni o replica. Per un elenco completo delle funzionalità di SQL Server non supportate da SQL Server Compact, vedere Differenze tra SQL Server Compact e SQL Server. Inoltre, alcuni degli strumenti che è possibile usare per modificare schemi e dati in SQL Server Express e SQL Server database non funzionano con SQL Server Compact. Ad esempio, non è possibile usare SQL Server Management Studio o SQL Server Data Tools in Visual Studio con database SQL Server Compact. Sono disponibili altre opzioni per l'uso dei database SQL Server Compact:

  • È possibile usare Esplora server in Visual Studio, che offre funzionalità limitate di manipolazione del database per SQL Server Compact.
  • È possibile usare la funzionalità di manipolazione del database di WebMatrix, con più funzionalità di Esplora server.
  • È possibile usare strumenti di terze parti o di open source relativamente completi, ad esempio la casella degli strumenti SQL Server Compacte l'utilità di script di SQL Compact.
  • È possibile scrivere ed eseguire script DDL personalizzati (linguaggio di definizione dei dati) per modificare lo schema del database.

È possibile iniziare con SQL Server Compact e quindi aggiornare in seguito man mano che le esigenze si evolveno. Le esercitazioni successive in questa serie illustrano come eseguire la migrazione da SQL Server Compact a SQL Server Express e a SQL Server. Tuttavia, se si sta creando una nuova applicazione e si prevede di dover SQL Server in futuro, probabilmente è preferibile iniziare con SQL Server o SQL Server Express.

Configurazione del motore di database SQL Server Compact per la distribuzione

Il software necessario per l'accesso ai dati nell'applicazione Contoso University è stato aggiunto installando i pacchetti NuGet seguenti:

I collegamenti puntano alle versioni correnti di questi pacchetti, che potrebbero essere più recenti rispetto a quelle installate nel progetto iniziale scaricato per questa esercitazione. Per la distribuzione in un provider di hosting, assicurarsi di usare Entity Framework 5.0 o versione successiva. Le versioni precedenti di Migrazioni Code First richiedono attendibilità completa e in molti provider di hosting l'applicazione verrà eseguita in Trust medio. Per altre informazioni su Trust medio, vedere l'esercitazione Distribuzione in IIS come ambiente di test .

L'installazione del pacchetto NuGet si occupa in genere di tutto ciò che è necessario per distribuire questo software con l'applicazione. In alcuni casi, ciò comporta attività come la modifica del file di Web.config e l'aggiunta di script di PowerShell che vengono eseguiti ogni volta che si compila la soluzione. Se si vuole aggiungere il supporto per una di queste funzionalità (ad esempio SQL Server Compact e Entity Framework) senza usare NuGet, assicurarsi di sapere cosa fa l'installazione del pacchetto NuGet in modo che sia possibile eseguire manualmente lo stesso lavoro.

Esiste un'eccezione in cui NuGet non si occupa di tutto ciò che è necessario fare per garantire la corretta distribuzione. Il pacchetto NuGet SqlServerCompact aggiunge uno script post-compilazione al progetto che copia gli assembly nativi in sottocartelle x86 e amd64 nella cartella bin del progetto, ma lo script non include tali cartelle nel progetto. Di conseguenza, La distribuzione Web non li copia nel sito Web di destinazione, a meno che non vengano inclusi manualmente nel progetto. Questo comportamento risulta dalla configurazione di distribuzione predefinita. Un'altra opzione, che non verrà usata in queste esercitazioni, consiste nel modificare l'impostazione che controlla questo comportamento. L'impostazione che è possibile modificare è Solo i file necessari per eseguire l'applicazione in Elementi da distribuire nella scheda Web Package/Publish della finestra Proprietà progetto . La modifica di questa impostazione non è generalmente consigliata perché può comportare la distribuzione di molti più file nell'ambiente di produzione rispetto alle esigenze. Per altre informazioni sulle alternative, vedere l'esercitazione Configurazione delle proprietà del progetto .

Compilare il progetto e quindi in Esplora soluzioni fare clic su Mostra tutti i file se non è già stato fatto. Potrebbe anche essere necessario fare clic su Aggiorna.

Solution_Explorer_Show_All_Files

Espandere la cartella bin per visualizzare le cartelle amd64 e x86 e quindi selezionare tali cartelle, fare clic con il pulsante destro del mouse e selezionare Includi in Progetto.

amd64_and_x86_in_Solution_Explorer.png

Le icone della cartella cambiano per mostrare che la cartella è stata inclusa nel progetto.

Solution_Explorer_amd64_included.png

Configurazione di Migrazioni Code First per la distribuzione del database applicazione

Quando si distribuisce un database dell'applicazione, in genere non si distribuisce semplicemente il database di sviluppo con tutti i dati presenti nell'ambiente di produzione, perché la maggior parte dei dati in esso contenuti è probabilmente disponibile solo per scopi 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 dei 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 livello validi o nomi reali del reparto.

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

Nelle versioni precedenti di Code First prima del rilascio delle migrazioni, è stato comune inserire anche i dati di test, perché con ogni modifica del modello durante lo sviluppo il database deve essere completamente eliminato e ricreato da zero. Con Migrazioni Code First, i dati di test vengono mantenuti dopo le modifiche del database, quindi i dati di test nel metodo Seed non sono necessari. Il progetto scaricato usa il metodo pre-Migrations di includere tutti i dati nel metodo Seed di una classe inizializzatore. In questa esercitazione si disabilita la classe inizializzatore e si abilitano le migrazioni. Si aggiornerà quindi il metodo Seed 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 è attiva.

Poiché si userà Migrazioni Code First, non è più 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 l'elemento che specifica la classe Code First initializer dall'elemento appSettings. L'elemento appSettings ora è simile al seguente:

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

Nota

Un altro modo per specificare una classe inizializzatore è farlo chiamando 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.

Abilitare quindi Migrazioni Code First.

Il primo passaggio consiste nel verificare che il progetto ContosoUniversity 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 cerca nel progetto di avvio per trovare la stringa di connessione del database.

Dal menu Strumenti fare clic su Gestione pacchetti NuGet e quindi console di Gestione pacchetti.

Selecting_Package_Manager_Console

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

enable-migrations_command

Questo comando crea un file Configuration.cs in una nuova cartella Migrations nel progetto ContosoUniversity.DAL.

Migrations_folder_in_Solution_Explorer

È stato selezionato il progetto DAL perché il comando "enable-migrations" deve essere eseguito nel progetto che contiene la classe di contesto Code First. Quando tale 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 dei comandi per il comando enable-migrations, è possibile immettere il comando "get-help enable-migrations".

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, Instructors = new List<Instructor>() },
    new Course { CourseID = 4022, Title = "Microeconomics", Credits = 3, DepartmentID = 4, Instructors = new List<Instructor>() },
    new Course { CourseID = 4041, Title = "Macroeconomics", Credits = 3, DepartmentID = 4, Instructors = new List<Instructor>() },
    new Course { CourseID = 1045, Title = "Calculus",       Credits = 4, DepartmentID = 2, Instructors = new List<Instructor>() },
    new Course { CourseID = 3141, Title = "Trigonometry",   Credits = 4, DepartmentID = 2, Instructors = new List<Instructor>() },
    new Course { CourseID = 2021, Title = "Composition",    Credits = 3, DepartmentID = 1, Instructors = new List<Instructor>() },
    new Course { CourseID = 2042, Title = "Literature",     Credits = 4, DepartmentID = 1, Instructors = new List<Instructor>() }
};
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();

I riferimenti per List avere righe rosse sotto di esse perché non si dispone ancora di un'istruzione using per lo 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;

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");

Questo esempio illustrato per questa esercitazione usa il AddOrUpdate metodo nel Seed metodo della classe Migrazioni Code FirstConfiguration. Migrazioni Code First chiama il Seed metodo dopo ogni migrazione e questo metodo aggiorna le righe già inserite o li inserisce se non esistono ancora. Il AddOrUpdate metodo potrebbe non essere la scelta migliore per lo scenario. Per altre informazioni, vedere Prestare attenzione al metodo AddOrUpdate di EF 4.3 nel blog di Julie Lerman.

Premere CTRL-MAIUSC-B per compilare il progetto.

Il passaggio successivo consiste nel creare una DbMigration classe per la migrazione iniziale. Si vuole che questa migrazione crei un nuovo database, quindi è necessario eliminare il database già esistente. SQL Server Compact database sono contenuti nei file sdf nella cartella App_Data. In Esplora soluzioni espandere App_Data nel progetto ContosoUniversity per visualizzare i due database SQL Server Compact rappresentati dai file sdf.

Fare clic con il pulsante destro del mouse sul file School.sdf e scegliere Elimina.

sdf_files_in_Solution_Explorer

Nella finestra Console di Gestione pacchetti immettere il comando "Add-migration Initial" per creare la migrazione iniziale e denominarla "Initial".

add-migration_command

Migrazioni Code First crea un altro file di classe nella cartella Migrations e questa classe contiene codice che crea lo schema del database.

Nella console di Gestione pacchetti immettere il comando "update-database" per creare il database ed eseguire il metodo Seed .

update-database_command

Se viene visualizzato un errore che indica che esiste già una tabella e non è possibile creare, è probabile che l'applicazione sia stata eseguita dopo l'eliminazione del database e prima dell'esecuzione update-databasedi . In tal caso, eliminare di nuovo il file School.sdf e riprovare il update-database comando.

Eseguire l'applicazione. Ora la pagina Studenti è vuota, ma la pagina Insegnanti contiene insegnanti. Si tratta di ciò che si otterrà in produzione dopo la distribuzione dell'applicazione.

Empty_Students_page

Instructors_page_after_initial_migration

Il progetto è ora pronto per distribuire il database Dell'istituto di istruzione .

Creazione di un database di appartenenza per la distribuzione

L'applicazione Contoso University usa il sistema di appartenenza ASP.NET e l'autenticazione dei moduli per autenticare e autorizzare gli utenti. Una delle relative pagine è accessibile solo agli amministratori. Per visualizzare questa pagina, eseguire l'applicazione e selezionare Aggiorna crediti dal menu a comparsa in Corsi. L'applicazione visualizza la pagina Log In , perché solo gli amministratori sono autorizzati a usare la pagina Aggiorna crediti .

Log_in_page

Accedere come "admin" usando la password "Pas$w0rd" (si noti il numero zero al posto della lettera "o" in "w0rd"). Dopo aver eseguito l'accesso, viene visualizzata la pagina Aggiorna crediti .

Update_Credits_page

Quando si distribuisce un sito per la prima volta, è comune escludere la maggior parte o tutti gli account utente creati per il test. In questo caso, si distribuirà un account amministratore e non verranno distribuiti account utente. Anziché eliminare manualmente gli account di test, si creerà un nuovo database di appartenenza con un solo account utente amministratore necessario nell'ambiente di produzione.

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.

Il database di appartenenza non viene gestito da Migrazioni Code First e non esiste alcun inizializzatore automatico che inizializza il database con account di test ,come per il database School. Pertanto, per mantenere disponibili i dati di test, si eseguirà una copia del database di test prima di crearne uno nuovo.

In Esplora soluzioni rinominare il file aspnet.sdf nella cartella App_Data in aspnet-Dev.sdf. Non creare una copia, rinominarla semplicemente: si creerà un nuovo database in un momento.

In Esplora soluzioni assicurarsi che il progetto Web (ContosoUniversity, non ContosoUniversity.DAL) sia selezionato. Nel menu Progetto selezionare quindi ASP.NET Configurazione per eseguire lo strumento di amministrazione sito Web (WAT).

Selezionare la scheda Sicurezza.

WAT_Security_tab

Fare clic su Crea o Gestisci ruoli e aggiungere un ruolo amministratore .

WAT_Create_New_Role

Tornare alla scheda Sicurezza , fare clic su Crea utente e aggiungere l'utente "amministratore" come amministratore. Prima di fare clic sul pulsante Crea utente nella pagina Crea utente , assicurarsi di selezionare la casella di controllo Amministratore . La password usata in questa esercitazione è "Pas$w0rd" e è possibile immettere qualsiasi indirizzo di posta elettronica.

WAT_Create_User

Chiudere il browser. In Esplora soluzioni fare clic sul pulsante aggiorna per visualizzare il nuovo file aspnet.sdf.

New_aspnet.sdf_in_Solution_Explorer

Fare clic con il pulsante destro del mouse su aspnet.sdf e scegliere Includi in Progetto.

Distinguere lo sviluppo dai database di produzione

In questa sezione verranno rinominati i database in modo che le versioni di sviluppo siano School-Dev.sdf e aspnet-Dev.sdf e le versioni di produzione siano School-Prod.sdf e aspnet-Prod.sdf. Questa operazione non è necessaria, ma in questo modo sarà possibile impedire di ottenere versioni di test e produzione dei database confuse.

In Esplora soluzioni fare clic su Aggiorna e espandere la cartella App_Data per visualizzare il database dell'istituto di istruzione creato in precedenza; fare clic con il pulsante destro del mouse su di esso e selezionare Includi nel progetto.

Including_School.sdf_in_project

Rinominare aspnet.sdf in aspnet-Prod.sdf.

Rinominare School.sdf in School-Dev.sdf.

Quando si esegue l'applicazione in Visual Studio non si desidera usare le versioni -Prod dei file di database, si desidera usare le versioni -Dev . È pertanto necessario modificare le stringhe di connessione nel file Web.config in modo che puntino alle versioni -Dev dei database. Non è stato creato un file School-Prod.sdf, ma è OK perché Code First creerà tale database nell'ambiente di produzione la prima volta che si esegue l'app.

Aprire il file dell'applicazione Web.config e individuare le stringhe di connessione:

<configuration>
  <!-- Settings -->
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=|DataDirectory|aspnet.sdf" providerName="System.Data.SqlServerCe.4.0" />
    <add name="SchoolContext" connectionString="Data Source=|DataDirectory|School.sdf" providerName="System.Data.SqlServerCe.4.0" />
  </connectionStrings>
  <!-- Settings -->
</configuration>

Modificare "aspnet.sdf" in "aspnet-Dev.sdf" e modificare "School.sdf" in "School-Dev.sdf":

<configuration>
  <!-- Settings -->
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=|DataDirectory|aspnet-Dev.sdf" providerName="System.Data.SqlServerCe.4.0" />
    <add name="SchoolContext" connectionString="Data Source=|DataDirectory|School-Dev.sdf" providerName="System.Data.SqlServerCe.4.0" />
  </connectionStrings>
  <!-- Settings -->
</configuration>

Il motore di database SQL Server Compact e entrambi i database sono ora pronti per essere distribuiti. Nell'esercitazione seguente è stata configurata Web.config trasformazioni di file automatiche per le impostazioni che devono essere diverse negli ambienti di sviluppo, test e produzione. Le impostazioni che devono essere modificate sono le stringhe di connessione, ma verranno configurate in un secondo momento quando si crea un profilo di pubblicazione.

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.