Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
När din modell ändras läggs migreringar till och tas bort som en del av normal utveckling, och migreringsfilerna checkas in i projektets källkontroll. Om du vill hantera migreringar måste du först installera EF Core-kommandoradsverktygen.
Tip
DbContext Om är i en annan sammansättning än startprojektet kan du uttryckligen ange mål- och startprojekten i antingen Package Manager-konsolverktygen eller .NET CLI-verktygen.
Lägga till en migrering
När din modell har ändrats kan du lägga till en migrering för den ändringen:
dotnet ef migrations add AddBlogCreatedTimestamp
Migreringsnamnet kan användas som ett incheckningsmeddelande i ett versionskontrollsystem. Du kan till exempel välja ett namn som AddBlogCreatedTimestamp om ändringen är en ny CreatedTimestamp egenskap på din Blog entitet.
Tre filer läggs till i projektet under katalogen Migrations:
-
XXXXXXXXXXXXXX_AddBlogCreatedTimestamp.cs– Huvudmigreringsfilen. Innehåller de åtgärder som krävs för att tillämpa migreringen (i
Up) och för att återställa den (iDown). - XXXXXXXXXXXXXX_AddBlogCreatedTimestamp.Designer.cs–-Migreringsmetadatafilen. Innehåller information som används av EF.
- MyContextModelSnapshot.cs–-En ögonblicksbild av din aktuella modell. Används för att avgöra vad som ändrades när nästa migrering skulle läggas till.
Tidsstämpeln i filnamnet hjälper till att hålla dem ordnade kronologiskt så att du kan se ändringars förlopp.
Namespaces
Du kan flytta migreringsfiler och ändra deras namnområde manuellt. Nya migreringar skapas som syskon till den senaste migreringen. Du kan också ange katalogen vid generationstillfället enligt följande:
dotnet ef migrations add InitialCreate --output-dir Your/Directory
Note
Du kan också ändra namnområdet oberoende av katalogen med hjälp av --namespace.
Anpassa migreringskod
Ef Core skapar vanligtvis korrekta migreringar, men du bör alltid granska koden och se till att den motsvarar den önskade ändringen. i vissa fall är det till och med nödvändigt att göra det.
Column renames
Ett viktigt exempel där anpassning av migreringar krävs är när en egenskap byts namn. Om du till exempel byter namn på en egenskap från Name till FullNamegenererar EF Core följande migrering:
migrationBuilder.DropColumn(
name: "Name",
table: "Customers");
migrationBuilder.AddColumn<string>(
name: "FullName",
table: "Customers",
nullable: true);
EF Core kan vanligtvis inte veta när avsikten är att släppa en kolumn och skapa en ny (två separata ändringar) och när en kolumn ska byta namn. Om migreringen ovan tillämpas as-iskommer alla kundnamn att gå förlorade. Om du vill byta namn på en kolumn ersätter du den genererade migreringen ovan med följande:
migrationBuilder.RenameColumn(
name: "Name",
table: "Customers",
newName: "FullName");
Tip
Migreringsprocessen varnar när en åtgärd kan leda till dataförlust (t.ex. genom att ta bort en kolumn). Om du ser den varningen bör du särskilt granska migreringskoden för noggrannhet.
Lägga till rå SQL
Det går att byta namn på en kolumn via ett inbyggt API, men i många fall är det inte möjligt. Vi kanske till exempel vill ersätta befintliga FirstName och LastName egenskaper med en enda ny egenskap för FullName. Migreringen som genereras av EF Core blir följande:
migrationBuilder.DropColumn(
name: "FirstName",
table: "Customer");
migrationBuilder.DropColumn(
name: "LastName",
table: "Customer");
migrationBuilder.AddColumn<string>(
name: "FullName",
table: "Customer",
nullable: true);
Precis som tidigare skulle detta orsaka oönskad dataförlust. Om du vill överföra data från de gamla kolumnerna ordnar vi om migreringarna och introducerar en rå SQL-åtgärd enligt följande:
migrationBuilder.AddColumn<string>(
name: "FullName",
table: "Customer",
nullable: true);
migrationBuilder.Sql(
@"
UPDATE Customer
SET FullName = FirstName + ' ' + LastName;
");
migrationBuilder.DropColumn(
name: "FirstName",
table: "Customer");
migrationBuilder.DropColumn(
name: "LastName",
table: "Customer");
Godtyckliga förändringar via rå SQL
Raw SQL kan också användas för att hantera databasobjekt som EF Core inte känner till. Det gör du genom att lägga till en migrering utan att göra någon modelländring. en tom migrering genereras, som du sedan kan fylla i med råa SQL-åtgärder.
Följande migrering skapar till exempel en lagrad SQL Server-procedur:
migrationBuilder.Sql(
@"
EXEC ('CREATE PROCEDURE getFullName
@LastName nvarchar(50),
@FirstName nvarchar(50)
AS
RETURN @LastName + @FirstName;')");
Tip
EXEC används när en instruktion måste vara den första eller bara en i en SQL-batch. Det kan också användas för att kringgå parsningsfel i idempotent-migreringsskript som kan inträffa när refererade kolumner för närvarande inte finns i en tabell.
Detta kan användas för att hantera alla aspekter av databasen, inklusive:
- Stored procedures
- Full-Text Search
- Functions
- Triggers
- Views
I de flesta fall omsluter EF Core automatiskt varje migrering i sin egen transaktion vid tillämpning av migreringar. Tyvärr kan vissa migreringsåtgärder inte utföras i en transaktion i vissa databaser. I dessa fall kan du välja bort transaktionen genom att skicka suppressTransaction: true till migrationBuilder.Sql.
Ta bort en migrering
Ibland lägger du till en migrering och inser att du behöver göra ytterligare ändringar i EF Core-modellen innan du tillämpar den. Om du vill ta bort den senaste migreringen använder du det här kommandot.
dotnet ef migrations remove
När du har tagit bort migreringen kan du göra de ytterligare modelländringarna och lägga till den igen.
Warning
Undvik att ta bort migreringar som redan har tillämpats på produktionsdatabaser. Detta innebär att du inte kommer att kunna återställa dessa migreringar från databaserna och kan bryta de antaganden som gjorts av efterföljande migreringar.
Listing migrations
Du kan lista alla befintliga migreringar på följande sätt:
dotnet ef migrations list
Söka efter väntande modelländringar
Note
Den här funktionen har lagts till i EF Core 8.0.
Ibland kanske du vill kontrollera om det har gjorts några modelländringar sedan den senaste migreringen. Detta kan hjälpa dig att veta när du eller en lagkamrat har glömt att lägga till en migrering. Ett sätt att göra det är att använda det här kommandot.
dotnet ef migrations has-pending-model-changes
Du kan också utföra den här kontrollen programmatiskt med hjälp av context.Database.HasPendingModelChanges(). Detta kan användas för att skriva ett enhetstest som misslyckas när du glömmer att lägga till en migrering.
Återställa alla migreringar
I vissa extrema fall kan det vara nödvändigt att ta bort alla migreringar och börja om. Detta kan enkelt göras genom att ta bort din migrering mapp och ta bort databasen. Då kan du skapa en ny inledande migrering som innehåller hela ditt aktuella schema.
Det går också att återställa alla migreringar och skapa en enda utan att förlora dina data. Detta kallas ibland för "squashing" och innebär lite manuellt arbete.
- Säkerhetskopiera databasen om något skulle gå fel.
- I databasen tar du bort alla rader från tabellen för migreringshistorik (t.ex.
DELETE FROM [__EFMigrationsHistory]på SQL Server). - Ta bort mappen Migrations.
- Skapa en ny migrering och generera ett SQL-skript för den (
dotnet ef migrations script). - Infoga en enskild rad i migreringshistoriken för att registrera att den första migreringen redan har tillämpats, eftersom tabellerna redan finns där. Infoga SQL är den sista åtgärden i SQL-skriptet som genererades ovan och liknar följande (glöm inte att uppdatera värdena):
INSERT INTO [__EFMigrationsHistory] ([MIGRATIONID], [PRODUCTVERSION])
VALUES (N'<full_migration_timestamp_and_name>', N'<EF_version>');
Warning
Alla anpassad migreringskod går förlorade när mappen Migrations tas bort. Eventuella anpassningar måste tillämpas på den nya inledande migreringen manuellt för att kunna bevaras.
Additional resources
- Entity Framework Core-verktygsreferens – .NET CLI : Innehåller kommandon för att uppdatera, släppa, lägga till, ta bort med mera.
- Entity Framework Core-verktygsreferens – Package Manager-konsolen i Visual Studio: Innehåller kommandon för att uppdatera, släppa, lägga till, ta bort med mera.