Dela via


Port från EF6 till EF Core

Entity Framework Core, eller EF Core för kort, är en total omskrivning av Entity Framework för moderna programarkitekturer. På grund av grundläggande ändringar finns det ingen direkt uppgraderingsväg. Syftet med den här dokumentationen är att tillhandahålla en guide från slutpunkt till slutpunkt för att portera dina EF6-program till EF Core.

Viktigt!

Innan du påbörjar portningsprocessen är det viktigt att verifiera att EF Core uppfyller kraven på dataåtkomst för ditt program. Du hittar allt du behöver i EF Core-dokumentationen.

Varning

EF Core stöder endast modern .NET och stöder inte .NET Framework. Om ditt projekt fortfarande är inriktat på .NET Framework måste du därför migrera till modern .NET innan du kan starta migreringen från EF6 till EF Core. Observera att EF6 har stöd för modern .NET, så du kan migrera till modern .NET först samtidigt som du behåller EF6 och sedan hantera migreringen från EF6 till EF Core.

Anledningar till uppgradering

All ny Entity Framework-utveckling sker i EF Core. Det finns inga planer på att backporta några nya funktioner till EF6. EF Core körs på de senaste .NET-körningarna och drar full nytta av körning, plattformsspecifika (till exempel ASP.NET Core eller WPF) och språkspecifika funktioner. Här är några av fördelarna med att uppgradera:

  • Dra nytta av de pågående prestandaförbättringarna i EF Core. Till exempel såg en kund som migrerade från EF6 till EF Core 6 en 40x minskning av användningen av en tung fråga på grund av frågedelningsfunktionen. Många kunder rapporterar enorma prestandavinster genom att flytta till den senaste EF Core.
  • Använd nya funktioner i EF Core. Inga nya funktioner läggs till i EF6. Alla nya funktioner, till exempel Azure Cosmos DB-providern och DbContextFactory, läggs bara till i EF Core. En fullständig jämförelse av EF6 med EF Core, inklusive flera funktioner som är exklusiva för EF Core, finns i: Jämför EF Core och EF6.
  • Modernisera programstacken med hjälp av beroendeinmatning och integrera dataåtkomsten sömlöst med tekniker som gRPC och GraphQL.

En anteckning om migreringar

Den här dokumentationen använder termerna port och uppgradering för att undvika förvirring med termen migreringar som en funktion i EF Core. Migreringar i EF Core är inte kompatibla med EF6 Code First-migreringar på grund av betydande förbättringar av hur migreringar hanteras. Det finns ingen rekommenderad metod för att porta migreringshistoriken, så planera att börja "nytt" i EF Core. Du kan underhålla kodbasen och data från dina EF6-migreringar. Använd din slutliga migrering i EF6 och skapa sedan en första migrering i EF Core. Du kommer att kunna spåra historiken i EF Core framöver.

Uppgraderingssteg

Uppgraderingssökvägen har delats upp i flera dokument som är ordnade efter uppgraderingsfasen och typen av program.

Fastställ din EF Core-smak

Det finns flera metoder för hur EF Core fungerar med din domänmodell och databasimplementering. I allmänhet följer de flesta appar ett av dessa mönster och hur du närmar dig din port beror på programmets "smak".

Kod som sanningskälla är en metod där allt modelleras genom kod och klasser, antingen via dataattribut, flytande konfiguration eller en kombination av båda. Databasen genereras ursprungligen baserat på den modell som definierats i EF Core och ytterligare uppdateringar hanteras vanligtvis via migreringar. Detta kallas ofta "kod först", men namnet är inte helt korrekt eftersom en metod är att börja med en befintlig databas, generera dina entiteter och sedan underhålla med kod framöver.

Metoden Database as source of truth (Databas som sanningskälla ) omfattar omvänd teknik eller byggnadsställning av koden från databasen. När schemaändringar görs återskapas eller uppdateras koden för att återspegla ändringarna. Detta kallas ofta "databas först".

Slutligen följer en mer avancerad hybridmappningsmetoden filosofin att koden och databasen hanteras separat, och EF Core används för att mappa mellan de två. Den här metoden undviker vanligtvis migreringar.

I följande tabell sammanfattas några skillnader på hög nivå:

Närma sig Utvecklarroll DBA-roll migreringar Byggnadsställning Repository
Programmera först Utforma entiteter och verifiera/anpassa genererade migreringar Verifiera schemadefinitioner och ändringar Per incheckning Inte tillgänglig Spåra entiteter, DbContext och migreringar
Databasen först Återskapa systemet efter ändringar och verifiera de genererade entiteterna Informera utvecklare när databasen ändras för att återskapa struktur Inte tillgänglig Per schemaändring Spåra tillägg/partiella klasser som utökar de genererade entiteterna
Hybrid Uppdatera fluent-konfigurationen så att den mappas när entiteter eller databaser ändras Informera utvecklare när databasen har ändrats så att de kan uppdatera entiteter och modellkonfiguration Inte tillgänglig Inte tillgänglig Spåra entiteter och DbContext

Hybridmetoden är en mer avancerad metod med ytterligare omkostnader jämfört med traditionella kod- och databasmetoder.

Förstå effekten av att flytta från EDMX

EF6 har stöd för ett särskilt modelldefinitionsformat med namnet Entity Data Model XML (EDMX). EDMX-filer innehåller flera definitioner, inklusive konceptuella schemadefinitioner (CSDL), mappningsspecifikationer (MSL) och lagringsschemadefinitioner (SSDL). EF Core spårar domän-, mappnings- och databasscheman via interna modelldiagram och stöder inte EDMX-formatet. Många blogginlägg och artiklar anger felaktigt detta innebär att EF Core endast stöder "kod först". EF Core stöder alla tre programmodeller som beskrivs i föregående avsnitt. Du kan återskapa modellen i EF Core genom att konstruera databasen på nytt. Om du använder EDMX för en visuell representation av entitetsmodellen bör du överväga att använda EF Core Power Tools med öppen källkod som tillhandahåller liknande funktioner för EF Core.

Mer information om effekten av bristande stöd för EDMX-filer finns i portningsguiden för EDMX .

Utför uppgraderingsstegen

Det är inte ett krav att porta hela programmet. EF6 och EF Core kan köras i samma program (se: använda EF Core och EF6 i samma program). För att minimera risken kan du överväga:

  1. Flytta till EF6 på .NET Core om du inte redan har gjort det.
  2. Migrera en liten del av din app till EF Core och kör den sida vid sida med EF6.
  3. Ta så småningom resten av kodbasen till EF Core och dra tillbaka EF6-koden.

När det gäller själva porten, på ett övergripande plan kommer du att:

  1. Överblicka beteendeändringar mellan EF6 och EF Core.
  2. Utför eventuella slutliga migreringar i EF6.
  3. Skapa ditt EF Core-projekt.
  4. Kopiera antingen kod till det nya projektet, kör omvänd teknik eller en kombination av båda.
  5. Byt namn på referenser och entiteter och uppdateringsbeteenden:
    • System.Data.Entity till Microsoft.EntityFrameworkCore
    • Ändra DbContext konstruktor för att ta emot alternativ och/eller skriva över OnConfiguring
    • DbModelBuilder till ModelBuilder
    • Byt namn på DbEntityEntry<T> till EntityEntry<T>
    • Flytta från Database.Log till Microsoft.Extensions.Logging (avancerade) eller DbContextOptionsBuilder.LogTo (enkla) API:er
    • Tillämpa ändringar för WithRequired och WithOptional (se här)
    • Uppdatera verifieringskoden. Det finns ingen inbyggd dataverifiering i EF Core, men du kan göra det själv.
    • Följ alla nödvändiga steg för att överföra från EDMX.
  6. Utför specifika steg baserat på din EF Core-metod:

Det finns många överväganden som relaterar till alla metoder, så du vill också granska sätt att hantera och arbeta med de detaljerade skillnaderna mellan EF6 och EF Core.