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.
In deze zelfstudie gaat u de migratiefunctie gebruiken voor het EF Core beheren van wijzigingen in gegevensmodellen. In latere zelfstudies voegt u meer migraties toe wanneer u het gegevensmodel wijzigt.
In deze handleiding leert u:
- Meer informatie over migraties
- Een eerste migratie maken
- Methoden omhoog en omlaag onderzoeken
- Meer informatie over de momentopname van het gegevensmodel
- De migratie toepassen
Prerequisites
About migrations
Wanneer u een nieuwe toepassing ontwikkelt, verandert uw gegevensmodel regelmatig en telkens wanneer het model wordt gewijzigd, wordt deze niet meer gesynchroniseerd met de database. U hebt deze zelfstudies gestart door het Entity Framework te configureren om de database te maken als deze niet bestaat. Telkens wanneer u het gegevensmodel wijzigt, voegt u entiteitsklassen toe, verwijdert of wijzigt of wijzigt u de DbContext-klasse. U kunt de database verwijderen en EF maakt een nieuw model dat overeenkomt met het model en deze met testgegevens bevat.
Deze methode om de database gesynchroniseerd te houden met het gegevensmodel werkt goed totdat u de toepassing in productie implementeert. Wanneer de toepassing wordt uitgevoerd in productie, worden meestal gegevens opgeslagen die u wilt behouden en wilt u niet steeds alles verliezen wanneer u een wijziging aanbrengt, zoals het toevoegen van een nieuwe kolom. Met EF Core de functie Migraties wordt dit probleem opgelost door EF in staat te stellen het databaseschema bij te werken in plaats van een nieuwe database te maken.
Als u wilt werken met migraties, kunt u de Package Manager Console (PMC) of de CLI gebruiken. Deze zelfstudies laten zien hoe u CLI-opdrachten gebruikt. Aan het einde van deze zelfstudie vindt u informatie over de PMC.
De database verwijderen
Installeer EF Core hulpprogramma's als een algemeen hulpprogramma en verwijder de database:
dotnet tool install --global dotnet-ef
dotnet ef database drop
Note
De architectuur van de binaire .NET-bestanden die moeten worden geïnstalleerd, vertegenwoordigt standaard de huidige besturingssysteemarchitectuur. Als u een andere besturingssysteemarchitectuur wilt opgeven, raadpleegt u de optie dotnet tool install, --arch. Zie GitHub issue dotnet/AspNetCore.Docs #29262 voor meer informatie.
In de volgende sectie wordt uitgelegd hoe u CLI-opdrachten uitvoert.
Een eerste migratie maken
Sla uw wijzigingen op en bouw het project. Open vervolgens een opdrachtvenster en navigeer naar de projectmap. Hier volgt een snelle manier om dit te doen:
Klik in Solution Explorer met de rechtermuisknop op het project en kies Map openen in Verkenner in het contextmenu.
Voer cmd in de adresbalk in en druk op Enter.
Voer de volgende opdracht in het opdrachtvenster in:
dotnet ef migrations add InitialCreate
In de voorgaande opdrachten wordt uitvoer weergegeven die vergelijkbaar is met het volgende:
info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
Entity Framework Core initialized 'SchoolContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
Done. To undo this action, use 'ef migrations remove'
Als er een foutbericht wordt weergegeven dat het bestand niet kan worden geopend... ContosoUniversity.dll omdat het door een ander proces wordt gebruikt.' zoekt u het PICTOGRAM IIS Express in het Systeemvak van Windows en klikt u er met de rechtermuisknop op. Klik vervolgens op ContosoUniversity > Stop Site.
Methoden omhoog en omlaag onderzoeken
Toen u de migrations add opdracht uitvoerde, heeft EF de code gegenereerd waarmee de database helemaal opnieuw wordt gemaakt. Deze code bevindt zich in de map Migrations , in het bestand met de naam <timestamp>_InitialCreate.cs. Met Up de methode van de InitialCreate klasse worden de databasetabellen gemaakt die overeenkomen met de entiteitssets van het gegevensmodel. De Down methode verwijdert ze, zoals wordt weergegeven in het volgende voorbeeld.
public partial class InitialCreate : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Course",
columns: table => new
{
CourseID = table.Column<int>(nullable: false),
Credits = table.Column<int>(nullable: false),
Title = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Course", x => x.CourseID);
});
// Additional code not shown
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Enrollment");
// Additional code not shown
}
}
Met migraties wordt de Up methode aangeroepen om de wijzigingen in het gegevensmodel voor een migratie te implementeren. Wanneer u een opdracht invoert om de update terug te draaien, roept Migrations de methode Down aan.
Deze code is voor de eerste migratie die is gemaakt toen u de migrations add InitialCreate opdracht hebt ingevoerd. De parameter voor de migratienaam ('InitialCreate' in het voorbeeld) wordt gebruikt voor de bestandsnaam en kan naar wens zijn. U kunt het beste een woord of woordgroep kiezen waarin wordt samengevat wat er in de migratie wordt gedaan. U kunt bijvoorbeeld een latere migratie 'AddDepartmentTable' noemen.
Als u de eerste migratie hebt gemaakt wanneer de database al bestaat, wordt de code voor het maken van de database gegenereerd, maar hoeft deze niet te worden uitgevoerd omdat de database al overeenkomt met het gegevensmodel. Wanneer u de app implementeert in een andere omgeving waar de database nog niet bestaat, wordt deze code uitgevoerd om uw database te maken, dus het is een goed idee om deze eerst te testen. Daarom hebt u de database eerder verwijderd, zodat migraties een geheel nieuwe database kunnen maken.
De momentopname van het gegevensmodel
Met migraties wordt een momentopname gemaakt van het huidige databaseschema in Migrations/SchoolContextModelSnapshot.cs. Wanneer u een migratie toevoegt, bepaalt EF wat er is gewijzigd door het gegevensmodel te vergelijken met het momentopnamebestand.
Gebruik de opdracht dotnet ef-migraties om een migratie te verwijderen.
dotnet ef migrations remove verwijdert de migratie en zorgt ervoor dat de momentopname correct opnieuw wordt ingesteld. Als dotnet ef migrations remove dit mislukt, kunt dotnet ef migrations remove -v u meer informatie krijgen over de fout.
Zie EF Core Migraties in teamomgevingen voor meer informatie over hoe het momentopnamebestand wordt gebruikt.
De migratie toepassen
Voer in het opdrachtvenster de volgende opdracht in om de database en tabellen erin te maken.
dotnet ef database update
De uitvoer van de opdracht is vergelijkbaar met de migrations add opdracht, behalve dat u logboeken ziet voor de SQL-opdrachten waarmee de database is ingesteld. De meeste logboeken worden weggelaten in de volgende voorbeelduitvoer. Als u dit detailniveau liever niet ziet in logboekberichten, kunt u het logboekniveau in het appsettings.Development.json bestand wijzigen. Zie Logboekregistratie in .NET en ASP.NET Core voor meer informatie.
info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
Entity Framework Core initialized 'SchoolContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (274ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
CREATE DATABASE [ContosoUniversity2];
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (60ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
IF SERVERPROPERTY('EngineEdition') <> 5
BEGIN
ALTER DATABASE [ContosoUniversity2] SET READ_COMMITTED_SNAPSHOT ON;
END;
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (15ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE [__EFMigrationsHistory] (
[MigrationId] nvarchar(150) NOT NULL,
[ProductVersion] nvarchar(32) NOT NULL,
CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])
);
<logs omitted for brevity>
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (3ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion])
VALUES (N'20190327172701_InitialCreate', N'5.0-rtm');
Done.
Gebruik SQL Server Object Explorer om de database te inspecteren zoals u in de eerste zelfstudie hebt gedaan. U ziet de toevoeging van een __EFMigrationsHistory tabel die bijhoudt welke migraties zijn toegepast op de database. Bekijk de gegevens in die tabel en u ziet één rij voor de eerste migratie. (In het laatste logboek in het voorgaande CLI-uitvoervoorbeeld ziet u de INSERT-instructie waarmee deze rij wordt gemaakt.)
Voer de toepassing uit om te controleren of alles nog steeds hetzelfde werkt als voorheen.
CLI en PMC vergelijken
De EF-hulpprogramma's voor het beheren van migraties zijn beschikbaar via .NET CLI-opdrachten of vanuit PowerShell-cmdlets in het venster Visual Studio Package Manager Console (PMC). In deze zelfstudie ziet u hoe u de CLI gebruikt, maar u kunt de PMC desgewenst gebruiken.
De EF-opdrachten voor de PMC-opdrachten bevinden zich in het pakket Microsoft.EntityFrameworkCore.Tools . Dit pakket is opgenomen in het Microsoft.AspNetCore.App metapackage, dus u hoeft geen pakketverwijzing toe te voegen als uw app een pakketverwijzing voor Microsoft.AspNetCore.Appheeft.
Belangrijk: Dit is niet hetzelfde pakket als het pakket dat u voor de CLI installeert door het .csproj bestand te bewerken. De naam van deze eindigt in Tools, in tegenstelling tot de CLI-pakketnaam die eindigt op Tools.DotNet.
Zie .NET CLI voor meer informatie over de CLI-opdrachten.
Zie Package Manager Console (Visual Studio) voor meer informatie over de PMC-opdrachten.
Code ophalen
de voltooide toepassing downloaden of weergeven.
Next step
Ga verder met de volgende zelfstudie om meer geavanceerde onderwerpen over het uitbreiden van het gegevensmodel te bekijken. Onderweg maakt en past u extra migraties toe.