Entity Framework Core från Microsoft är en plattformsoberoende, lätt och flexibel version av dess föregångare, Entity Framework. EF Core är ett verktyg för objektrelationell kartläggning (ORM) som erbjuder ett standardiserat sätt att lagra och hämta data till och från olika datakällor.
Genom att programmera mot en konceptuell snarare än en relationell modell. Som ett resultat finns det ingen impedansöverensstämmelse mellan hur data representeras i applikationen och hur den lagras i databasen.
Arv är en funktion i objektorienterad programmering som gör att du kan skapa underklasser från en basklass och därigenom utöka basklassens funktioner. Entity Framework Core ger utmärkt stöd för arv. Den här artikeln talar om hur vi kan implementera arv i Entity Framework Core. Vi kommer att dra nytta av EntityDeveloper för att prata med databasen.
Förutsättningar
För att kunna arbeta med kodexemplen som visas i den här artikeln bör du ha följande installerat i ditt system:
- Visual Studio 2019 Community Edition (nedladdning)
- dotConnect för PostgreSQL (nedladdning)
- Enhetsutvecklare
Du kan ladda ner en kopia av Entity Developer (testversion) här:https://www.devart.com/entitydeveloper/download.html.
Skapa en databas
Nu när ASP.NET Core Web API-projektet har skapats i Visual Studio 2019; nästa steg är att skapa databasen. Observera att vi för enkelhetens skull kommer att använda en databas med några två tabeller med enkla mönster i det här exemplet. Skapa en databas som heter Demo och skapa tre tabeller (Person, User och Manager) i den. Fälten i dessa tabeller bör mappas med egenskaperna för modellklasserna som visas längre fram i den här artikeln.
Skapa ett nytt ASP.NET Core Web API-projekt
Förutsatt att den nödvändiga programvaran har installerats på din dator för att kunna arbeta med Entity Developer, följ stegen som beskrivs nedan för att skapa ett nytt ASP.NET Core Web API-projekt.
1. Öppna först Visual Studio 2019 IDE.
2. Klicka sedan på Skapa ett nytt projekt när IDE har laddats.
3. Klicka på Skapa ett nytt projekt .
4. Välj sedan ASP.NET Core Web Application .
5. Klicka på Nästa .
6. Ange projektnamn och plats – där det ska lagras i ditt system.
7. Om du vill kan du klicka på Placera lösning och projekt i samma katalog kryssruta.
8. Klicka sedan på Skapa .
9. I Skapa en ny ASP.NET Core Web Application dialogfönstret som visas härnäst, välj API som projektmall.
10. Välj ASP.NET Core 3.1 eller senare som version.
11. Du bör inaktivera Konfigurera för HTTPS och Aktivera Docker Support alternativ genom att avaktivera respektive kryssrutor.
12. Eftersom vi inte kommer att använda autentisering i det här exemplet, ange autentisering som Ingen autentisering .
13. Klicka slutligen på Skapa för att avsluta processen.
Skapa en enhetsdatamodell
Nästa sak du bör göra är att skapa en enhetsdatamodell. När du skapar en modell i Entity Developer finns det två alternativ att välja mellan:Database First (detta är valt som standard) och Model First. I det här exemplet kommer vi att dra fördel av Databas First-metoden. Kom ihåg att välja Generera från databas alternativet för att generera din modell från databasen och välja de databasobjekt som du vill ska vara en del av din enhetsdatamodell.
Följ dessa steg som beskrivs nedan för att skapa en enhetsdatamodell i Entity Developer med hjälp av databas-först-metoden.
1. Välj ditt projekt i Solution Explorer Fönster.
2. Högerklicka och välj Lägg till>Nytt objekt .
3. Välj Devart EF Core Model som mallen som visas nedan.
4. Ange ett namn för din enhetsdatamodell och klicka på Lägg till .
5. Ange anslutningsegenskaperna och testa anslutningen.
6. Klicka på Nästa att fortsätta.
7. Som standard kommer alternativet "Generera från databas" att vara valt. Eftersom vi vill att modellen ska skapas från databasen klickar du på Nästa att fortsätta.
8. Avmarkera alla alternativ och ange sedan endast de databasobjekt som du vill ska vara en del av modellen. Här ska du välja produkt- och kategoritabellerna.
9. I Inställningar namnregler skärm kan du valfritt ange namnregler för dina enheter.
10. På nästa skärm kan du valfritt ange modellegenskaper.
11. På nästa skärm kan du valfritt välja innehållet i modelldiagrammet.
12. På nästa skärm kan du valfritt ange kodgenereringsmallar.
13. Ange vilken kodgenereringsmall du väljer.
14. Klicka slutligen på Slutför för att slutföra processen.
Din ADO.NET Entity Data Model med hjälp av Entity Developer kommer att skapas tillsammans med datakontexten och modellklasserna.
Arv i Entity Framework Core
Entity Framework Core (EF Core) låter dig mappa en .NET-klasshierarki till en databas. Därför kan du skapa dina .NET-enheter representerade som bas- och härledda typer, och EF Core kan generera databasschemat åt dig. Men eftersom EF Core inte automatiskt letar efter basklasser eller härledda klasser, måste du uttryckligen deklarera en CLR-typ på din modell om du vill att den ska mappas. Det bör noteras att det inte räcker att specificera enbart bastypen, dvs. det kommer inte automatiskt att tvinga EF Core att inkludera alla undertyper.
Följande kodlista illustrerar hur du kan skapa en anpassad datakontext för en klass såväl som dess underklass.
public class DemoDbContext : DbContext {
public DbSet<Person> Person { get; set; }
public DbSet<Author> Authors { get; set; }
}
public class Person {
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class Author : Person {
public string SubjectArea { get; set; }
}
Tabell per hierarki (TPH)
I arvstypen Tabell per hierarki (TPH) (detta är standardarvstypen i EF Core), skulle du bara ha en tabell för hela hierarkin för att representera alla klasser. För att skilja mellan olika typer används en "diskriminator"-kolumn. Som standard är tabellen döpt efter basklassen eller ett DbSet-fält kopplat till den. Tabellens namn skulle vara namnet på basklassen eller dess motsvarande DbSet-attribut som standard.
Följande kodavsnitt illustrerar hur tabell per hierarki kan representeras:
public abstract class Person {
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class User : Person {
public string UserName { get; set; }
public string Password { get; set; }
}
public class Manager : Person {
public string Department { get; set; }
}
Tabell per typ (TPT)
Arvsrelationer med tabell per typ (TPT) visas som främmande nycklar. I detta tillvägagångssätt representerar en separat tabell varje typ (inklusive abstrakta typer) av arvskedjan. De främmande nycklarna används för att länka tabeller som representerar härledda typtyper med deras bastyp. I denna strategi skapar EF Core en bastabell i databasen och flera tabeller specifika för varje härledd typ.
Följande kodlista visar hur tillvägagångssättet Table Per Type (TPT) kan implementeras:
public abstract class Person {
public int Id { get; set; }
public string FullName { get; set; }
}
[Table("Users")]
public class User : Person {
public string UserName { get; set; }
public string Password { get; set; }
}
[Table("Managers")]
public class Manager : Person {
public string Department { get; set; }
}
Tabell per betongtyp (TPC)
I TPC-metoden (Tabell Per Concrete Type) representeras varje betongtyp i arvskedjan av en separat tabell i databasen men inte den abstrakta klassen. Egenskaper för valfri abstrakt bastyp skapas som fält i tabellen för varje betongtyp.
Klassdesignen kommer att vara densamma som TPH. Så här kan du ange en tabell för var och en av underklasserna:
public class MyDbContext : DbContext {
public DbSet<Person> Person { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
modelBuilder.Entity<User>().Map(m => {
m.MapInheritedProperties();
m.ToTable("Users");
});
modelBuilder.Entity<Author>().Map(m => {
m.MapInheritedProperties();
m.ToTable("Managers");
});
}
}
Sammanfattning
Entity Framework Core kan köras på vilken plattform som helst som stöder .NET Standard 2.1. Detta inkluderar .NET Core 3.1 såväl som .NET 5. Det kommer dock inte att köras på .NET Standard 2.0, vilket innebär att du från och med EF Core 5.0 inte kommer att kunna utnyttja EF Core med .NET Framework. Trevlig läsning!