Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Deze reeks zelfstudies laat zien hoe u een ASP.NET-webtoepassing implementeert (publiceert) naar Azure App Service Web Apps of naar een externe hostingprovider met behulp van Visual Studio 2012 of Visual Studio 2010. Zie de eerste zelfstudie in de reeks voor meer informatie over de reeks.
Overzicht
Deze zelfstudie laat zien hoe u het project voorbereidt op databaseimplementatie. De databasestructuur en sommige (niet alle) gegevens in de twee databases van de toepassing moeten worden geïmplementeerd om test-, faserings- en productieomgevingen te testen.
Bij het ontwikkelen van een toepassing voert u doorgaans testgegevens in een database in die u niet wilt implementeren op een livesite. Mogelijk hebt u echter ook enkele productiegegevens die u wilt implementeren. In deze zelfstudie configureert u het Contoso University-project en bereidt u SQL-scripts voor, zodat de juiste gegevens worden opgenomen wanneer u implementeert.
Herinnering: Als u een foutbericht krijgt of iets niet werkt terwijl u de zelfstudie doorloopt, controleert u de pagina voor probleemoplossing.
SQL Server Express LocalDB
De voorbeeldtoepassing maakt gebruik van SQL Server Express LocalDB. SQL Server Express is de gratis editie van SQL Server. Deze wordt vaak gebruikt tijdens de ontwikkeling omdat deze is gebaseerd op dezelfde database-engine als volledige versies van SQL Server. U kunt testen met SQL Server Express en er zeker van zijn dat de toepassing hetzelfde werkt in productie, met enkele uitzonderingen voor functies die variëren tussen SQL Server-edities.
LocalDB is een speciale uitvoeringsmodus van SQL Server Express waarmee u met databases kunt werken als .mdf bestanden. LocalDB-databasebestanden worden doorgaans bewaard in de App_Data map van een webproject. Met de functie gebruikersexemplaren in SQL Server Express kunt u ook werken met .mdf bestanden, maar de functie voor het gebruikersexemplaren is afgeschaft; Daarom wordt LocalDB aanbevolen voor het werken met .mdf bestanden.
Sql Server Express wordt doorgaans niet gebruikt voor productiewebtoepassingen. LocalDB wordt met name niet aanbevolen voor productiegebruik met een webtoepassing, omdat deze niet is ontworpen voor gebruik met IIS.
In Visual Studio 2012 wordt LocalDB standaard geïnstalleerd met Visual Studio. In Visual Studio 2010 en eerdere versies wordt SQL Server Express (zonder LocalDB) standaard geïnstalleerd met Visual Studio; Daarom hebt u deze geïnstalleerd als een van de vereisten in de eerste zelfstudie in deze reeks.
Zie de volgende bronnen die werken met SQL Server-databases voor meer informatie over SQL Server-edities, waaronder LocalDB.
Entity Framework en Universal Providers
Voor databasetoegang vereist de Contoso University-toepassing de volgende software die moet worden geïmplementeerd met de toepassing, omdat deze niet is opgenomen in .NET Framework:
- ASP.NET Universal Providers (maakt het ASP.NET-lidmaatschapssysteem mogelijk om Azure SQL Database te gebruiken)
- Entity Framework
Omdat deze software is opgenomen in NuGet-pakketten, is het project al ingesteld zodat de vereiste assembly's met het project worden geïmplementeerd. (De koppelingen verwijzen naar de huidige versies van deze pakketten, die mogelijk nieuwer zijn dan wat is geïnstalleerd in het startersproject dat u voor deze zelfstudie hebt gedownload.)
Als u implementeert naar een externe hostingprovider in plaats van Azure, moet u Entity Framework 5.0 of hoger gebruiken. Voor eerdere versies van Code First Migrations is Volledig vertrouwen vereist en de meeste hostingproviders voeren uw toepassing uit in Medium Trust. Zie de zelfstudie Implementeren in IIS als testomgeving voor meer informatie over Gemiddeld vertrouwen.
Code First Migrations configureren voor implementatie van toepassingsdatabases
De Contoso University-toepassingsdatabase wordt beheerd door Code First en u implementeert deze met behulp van Code First Migrations. Zie de eerste zelfstudie in deze reeks voor een overzicht van de database-implementatie met behulp van Code First Migrations.
Wanneer u een toepassingsdatabase implementeert, implementeert u doorgaans niet alleen uw ontwikkelingsdatabase met alle gegevens in de database naar productie, omdat veel van de gegevens daarin waarschijnlijk alleen voor testdoeleinden beschikbaar zijn. De namen van leerlingen/studenten in een testdatabase zijn bijvoorbeeld fictief. Aan de andere kant kunt u vaak niet alleen de databasestructuur implementeren zonder gegevens erin. Sommige gegevens in uw testdatabase kunnen echte gegevens zijn en moeten er zijn wanneer gebruikers de toepassing gaan gebruiken. Uw database kan bijvoorbeeld een tabel bevatten die geldige cijferwaarden of echte afdelingsnamen bevat.
Als u dit algemene scenario wilt simuleren, configureert u een Code First Migrations-methode Seed die alleen de gegevens in de database invoegt die u in productie wilt hebben. Deze Seed methode mag geen testgegevens invoegen omdat deze in productie wordt uitgevoerd nadat Code First de database in productie heeft gemaakt.
In eerdere versies van Code First voordat migraties werden uitgebracht, was het gebruikelijk voor Seed methoden om ook testgegevens in te voegen, omdat bij elke modelwijziging tijdens de ontwikkeling de database volledig moest worden verwijderd en opnieuw moest worden gemaakt. Bij Code First Migrations worden testgegevens bewaard nadat de database is gewijzigd, dus het is niet nodig om testgegevens in de Seed methode op te nemen. Het project dat u hebt gedownload, gebruikt de methode voor het opnemen van alle gegevens in de Seed methode van een initialisatieklasse. In deze zelfstudie schakelt u die initialisatieklasse uit en schakelt u Migraties in. Vervolgens werkt u de Seed methode bij in de configuratieklasse Migrations, zodat alleen gegevens worden ingevoegd die u in productie wilt invoegen.
In het volgende diagram ziet u het schema van de toepassingsdatabase:
Voor deze zelfstudies gaat u ervan uit dat de Student en Enrollment tabellen leeg moeten zijn wanneer de site voor het eerst wordt geïmplementeerd. De andere tabellen bevatten gegevens die vooraf moeten worden geladen wanneer de toepassing live gaat.
De initialisatiefunctie uitschakelen
Omdat u Code First Migrations gaat gebruiken, hoeft u de DropCreateDatabaseIfModelChanges initialisatiefunctie Code First niet te gebruiken. De code voor deze initialisatiefunctie bevindt zich in het bestand SchoolInitializer.cs in het project ContosoUniversity.DAL. Een instelling in het element van het appSettingsWeb.config-bestand zorgt ervoor dat deze initialisatiefunctie wordt uitgevoerd wanneer de toepassing voor het eerst toegang probeert te krijgen tot de database:
<appSettings>
<add key="Environment" value="Dev" />
<add key="DatabaseInitializerForType ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL" value="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity.DAL" />
</appSettings>
Open het Web.config-bestand van de toepassing en verwijder of markeer het element dat de add klasse Code First initializer aangeeft. Het appSettings element ziet er nu als volgt uit:
<appSettings>
<add key="Environment" value="Dev" />
</appSettings>
Opmerking
Een andere manier om een initialisatieklasse op te geven, is door de Database.SetInitializer methode in het Application_Start aan te roepen. Als u Migraties inschakelt in een project dat die methode gebruikt om de initialisatiefunctie op te geven, verwijdert u die coderegel.
Opmerking
Als u Visual Studio 2013 gebruikt, voegt u de volgende stappen toe tussen stap 2 en 3: (a) Voer in PMC "update-package entityframework -version 6.1.1" in om de huidige versie van EF op te halen. Bouw vervolgens (b) het project om een lijst met buildfouten op te halen en op te lossen. Verwijder 'using'-instructies voor naamruimten die niet meer bestaan, klik met de rechtermuisknop en klik op Oplossen om 'using'-instructies toe te voegen waar ze nodig zijn, en verander exemplaren van System.Data.EntityState in System.Data.Entity.EntityState.
Code First Migrations inschakelen
Zorg ervoor dat het ContosoUniversity-project (niet ContosoUniversity.DAL) is ingesteld als het opstartproject. Klik in Solution Explorer met de rechtermuisknop op het ContosoUniversity-project en selecteer Instellen als opstartproject. Code First Migrations zoekt in het opstartproject naar de databaseverbindingsreeks.
Kies in het menu Extra, NuGet Package Manager>Package Manager Console.
Selecteer bovenaan het venster Package Manager Console contosoUniversity.DAL als het standaardproject en voer vervolgens 'enable-migrations' in bij de
PM>prompt.
(Als u een foutbericht krijgt waarin wordt aangegeven dat de opdracht enable-migrations niet wordt herkend, voert u de opdracht EntityFramework -Reinstall in en probeert u het opnieuw.)
Met deze opdracht maakt u een map Migrations in het project ContosoUniversity.DAL en plaatst u deze map in twee bestanden: een Configuration.cs-bestand dat u kunt gebruiken om Migraties te configureren, en een InitialCreate.cs-bestand voor de eerste migratie waarmee de database wordt gemaakt.
U hebt het DAL-project geselecteerd in de vervolgkeuzelijst Standaardproject van de Package Manager-console , omdat de
enable-migrationsopdracht moet worden uitgevoerd in het project dat de contextklasse Code First bevat. Wanneer deze klasse zich in een klassebibliotheekproject bevindt, zoekt Code First Migrations naar de databaseverbindingsreeks in het opstartproject voor de oplossing. In de ContosoUniversity-oplossing is het webproject ingesteld als het opstartproject. Als u het project met de verbindingsreeks niet wilt aanwijzen als het opstartproject in Visual Studio, kunt u het opstartproject opgeven in de PowerShell-opdracht. Voer de opdrachtget-help enable-migrationsin om de syntaxis van de opdracht te zien.Met
enable-migrationsde opdracht wordt automatisch de eerste migratie gemaakt omdat de database al bestaat. Een alternatief is om migraties de database te laten aanmaken. Hiervoor gebruikt u Server Explorer of SQL Server Object Explorer om de ContosoUniversity-database te verwijderen voordat u Migraties inschakelt. Nadat u migraties hebt ingeschakeld, maakt u de eerste migratie handmatig door de opdracht Add-migration InitialCreate in te voeren. Vervolgens kunt u de database maken door de opdracht 'update-database' in te voeren.
Instellen van de Seed-methode
Voor deze zelfstudie voegt u vaste gegevens toe door code toe te voegen aan de Seed methode van de Code First Migrations Configuration klasse. Code First Migrations roept de Seed methode na elke migratie aan.
Omdat de Seed methode na elke migratie wordt uitgevoerd, zijn er al gegevens in de tabellen na de eerste migratie. Als u deze situatie wilt afhandelen, gebruikt u de methode voor het AddOrUpdate bijwerken van rijen die al zijn ingevoegd of voegt u deze in als deze nog niet bestaan. De AddOrUpdate methode is mogelijk niet de beste keuze voor uw scenario. Voor meer informatie, zie Wees voorzichtig met de EF 4.3 AddOrUpdate-methode op Julie Lerman's blog.
Open het bestand Configuration.cs en vervang de opmerkingen in de
Seedmethode door de volgende code: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();De verwijzingen naar
Listhebben rode golvende lijnen eronder, omdat u nog geenusing-instructie voor de naamruimte hebt. Klik met de rechtermuisknop op een van de exemplaren vanList, klik op Oplossen en selecteer vervolgens gebruiken System.Collections.Generic.
Met deze menuselectie wordt de volgende code toegevoegd aan de
usinginstructies bovenaan het bestand.using System.Collections.Generic;Druk op Ctrl-Shift-B om het project te bouwen.
Het project is nu klaar om de ContosoUniversity-database te implementeren. Nadat u de toepassing hebt geïmplementeerd, zal, wanneer u deze voor de eerste keer uitvoert en naar een pagina navigeert die toegang tot de database heeft, Code First de database creëren en deze Seed methode uitvoeren.
Opmerking
Het toevoegen van code aan de methode is een van de Seed vele manieren waarop u vaste gegevens in de database kunt invoegen. Een alternatief is het toevoegen van code aan de Up en Down methoden van elke migratieklasse. De Up en Down methoden bevatten code waarmee databasewijzigingen worden geïmplementeerd. U ziet voorbeelden hiervan in de zelfstudie Een database-update implementeren .
U kunt ook code schrijven waarmee SQL-instructies worden uitgevoerd met behulp van de Sql methode. Als u bijvoorbeeld een kolom Budget aan de tabel Afdeling toevoegt en alle afdelingsbudgetten wilt initialiseren naar $ 1.000,00 als onderdeel van een migratie, kunt u de volgende coderegel toevoegen aan de Up methode voor die migratie:
Sql("UPDATE Department SET Budget = 1000");
Scripts maken voor de implementatie van lidmaatschapsdatabases
De Contoso University-toepassing maakt gebruik van het ASP.NET lidmaatschapssysteem en formulierverificatie om gebruikers te verifiëren en te autoriseren. De pagina Updatetegoeden is alleen toegankelijk voor gebruikers die de rol Beheerder hebben.
Voer de toepassing uit en klik op Cursussen en klik vervolgens op Tegoed bijwerken.
De pagina Aanmelden wordt weergegeven omdat de pagina Updatetegoed beheerdersbevoegdheden vereist.
Voer de beheerder in als gebruikersnaam en devpwd als het wachtwoord en klik op Aanmelden.
De pagina Tegoed bijwerken wordt weergegeven.
Gebruikers- en rolgegevens bevinden zich in de aspnet-ContosoUniversity-database die is opgegeven door de DefaultConnection-verbindingsreeks in het bestandWeb.config .
Deze database wordt niet beheerd door Entity Framework Code First, dus u kunt migraties niet gebruiken om deze te implementeren. U gebruikt de dbDacFx-provider om het databaseschema te implementeren en u configureert het publicatieprofiel om een script uit te voeren waarmee initiële gegevens worden ingevoegd in databasetabellen.
Opmerking
Er is een nieuw ASP.NET-lidmaatschapssysteem (nu ASP.NET Identity genoemd) geïntroduceerd in Visual Studio 2013. Met het nieuwe systeem kunt u zowel toepassings- als lidmaatschapstabellen in dezelfde database behouden en kunt u Code First Migrations gebruiken om beide te implementeren. De voorbeeldtoepassing maakt gebruik van het eerdere ASP.NET lidmaatschapssysteem, dat niet kan worden geïmplementeerd met behulp van Code First Migrations. De procedures voor het implementeren van deze lidmaatschapsdatabase zijn ook van toepassing op elk ander scenario waarin uw toepassing een SQL Server-database moet implementeren die niet is gemaakt door Entity Framework Code First.
Hier wilt u doorgaans ook niet dezelfde gegevens in productie gebruiken als die u in ontwikkeling hebt. Wanneer u een site voor het eerst implementeert, is het gebruikelijk om de meeste of alle gebruikersaccounts die u voor het testen maakt, uit te sluiten. Daarom heeft het gedownloade project twee lidmaatschapsdatabases: aspnet-ContosoUniversity.mdf met ontwikkelingsgebruikers en aspnet-ContosoUniversity-Prod.mdf met productiegebruikers. Voor deze zelfstudie zijn de gebruikersnamen hetzelfde in beide databases: beheerder en niet-beheerder. Beide gebruikers hebben de wachtwoorddevpwd in de ontwikkelingsdatabase en prodpwd in de productiedatabase.
U implementeert de ontwikkelingsgebruikers in de testomgeving en de productiegebruikers in de staging- en productieomgeving. Hiervoor maakt u twee SQL-scripts in deze zelfstudie, één voor ontwikkeling en één voor productie. In latere zelfstudies configureert u het publicatieproces om ze uit te voeren.
Opmerking
De lidmaatschapsdatabase slaat een hash van accountwachtwoorden op. Als u accounts van de ene computer naar de andere wilt implementeren, moet u ervoor zorgen dat hash-routines geen andere hashes genereren op de doelserver dan op de broncomputer. Ze genereren dezelfde hashes wanneer u de ASP.NET Universele providers gebruikt, zolang u het standaardalgoritmen niet wijzigt. Het standaard algoritme wordt HMACSHA256 en wordt opgegeven in het validatiekenmerk van het machineKey-element in het Web.config-bestand.
U kunt scripts voor gegevensimplementatie handmatig maken met behulp van SQL Server Management Studio (SSMS) of met behulp van een hulpprogramma van derden. In deze rest van deze zelfstudie ziet u hoe u dit kunt doen in SSMS, maar als u SSMS niet wilt installeren en gebruiken, kunt u de scripts ophalen uit de voltooide versie van het project en doorgaan naar de sectie waarin u ze opslaat in de oplossingsmap.
Als u SSMS wilt installeren, installeert u deze vanuit het Downloadcentrum: Microsoft SQL Server 2012 Express door te klikken op ENU-\x64\SQLManagementStudio_x64_ENU.exe of ENU-\x86\SQLManagementStudio_x86_ENU.exe. Als u de verkeerde voor uw systeem kiest, kan het niet worden geïnstalleerd en kunt u de andere proberen.
(Houd er rekening mee dat dit een download van 600 megabyte is. Het kan lang duren om te installeren en vereist een herstart van uw computer.)
Klik op de eerste pagina van het SQL Server-installatiecentrum op Nieuwe zelfstandige installatie van SQL Server of voeg onderdelen toe aan een bestaande installatie en volg de instructies, waarbij u de standaardkeuzen accepteert.
Het script voor de ontwikkelingsdatabase maken
Voer SSMS uit.
Voer in het dialoogvenster Verbinding maken met server(localdb)\v11.0 in als servernaam, laat verificatie ingesteld op Windows-verificatie en klik vervolgens op Verbinding maken.
Vouw databases uit in het venster Objectverkenner, klik met de rechtermuisknop op aspnet-ContosoUniversity, klik op Taken en klik vervolgens op Scripts genereren.
Klik in het dialoogvenster Scripts genereren en publiceren op Scriptopties instellen.
U kunt de stap Objecten kiezen overslaan, omdat de standaardwaarde de volledige database script en alle databaseobjecten is en dat is wat u wilt.
Klik op Geavanceerd.
Schuif in het dialoogvenster Geavanceerde scriptopties omlaag naar Typen gegevens die u wilt uitvoeren en klik op de optie Alleen gegevens in de vervolgkeuzelijst.
Wijzig Script USE DATABASE in False. USE-instructies zijn niet geldig voor Azure SQL Database en zijn niet nodig voor implementatie naar SQL Server Express in de testomgeving.
Klik op OK.
In het dialoogvenster Scripts genereren en publiceren geeft het vak Bestandsnaam aan waar het script wordt gemaakt. Wijzig het pad naar de oplossingsmap (de map met het ContosoUniversity.sln-bestand) en de bestandsnaam in aspnet-data-dev.sql.
Klik op Volgende om naar het tabblad Samenvatting te gaan en klik nogmaals op Volgende om het script te maken.
Klik op Voltooien.
Het script voor de productiedatabase maken
Omdat u het project nog niet hebt uitgevoerd met de productiedatabase, is het nog niet gekoppeld aan het LocalDB-exemplaar. Daarom moet u eerst de database koppelen.
Klik in de SSMS-objectverkenner met de rechtermuisknop op Databases en klik op Bijvoegen.
Klik in het dialoogvenster Databases bijvoegen op Toevoegen en navigeer vervolgens naar het aspnet-ContosoUniversity-Prod.mdf bestand in de map App_Data .
Klik op OK.
Volg dezelfde procedure die u eerder hebt gebruikt om een script voor het productiebestand te maken. Geef het scriptbestand een naam aspnet-data-prod.sql.
Overzicht
Beide databases zijn nu klaar om te worden geïmplementeerd en u hebt twee scripts voor gegevensimplementatie in uw oplossingsmap.
In de volgende zelfstudie configureert u projectinstellingen die van invloed zijn op de implementatie en stelt u automatische Web.config bestandstransformaties in voor instellingen die anders moeten zijn in de geïmplementeerde toepassing.
Meer informatie
Zie Projectbibliotheken beheren met NuGet - en NuGet-documentatie voor meer informatie over NuGet. Als u NuGet niet wilt gebruiken, moet u leren hoe u een NuGet-pakket analyseert om te bepalen wat het doet wanneer het wordt geïnstalleerd. (Het kan bijvoorbeeld Web.config transformaties configureren, PowerShell-scripts configureren voor uitvoering tijdens de build, enzovoort) Zie Een pakket- en configuratiebestand en broncodetransformatiesmaken en publiceren voor meer informatie over hoe NuGet werkt.