Database
 sql >> Database >  >> RDS >> Database

Come lavorare con l'ereditarietà in Entity Framework Core

Entity Framework Core di Microsoft è una versione multipiattaforma, leggera e flessibile del suo predecessore, Entity Framework. EF Core è uno strumento di mappatura relazionale a oggetti (ORM) che offre un modo standardizzato di archiviare e recuperare dati da e verso origini dati diverse.

Programmando contro un modello concettuale piuttosto che relazionale. Di conseguenza, non vi è alcuna discrepanza di impedenza tra il modo in cui i dati vengono rappresentati nell'applicazione e il modo in cui vengono archiviati nel database.

L'ereditarietà è una funzionalità della programmazione orientata agli oggetti che consente di creare sottoclassi da una classe base estendendo così le funzionalità della classe base. Entity Framework Core fornisce un eccellente supporto per l'ereditarietà. Questo articolo spiega come possiamo implementare l'ereditarietà in Entity Framework Core. Sfrutteremo EntityDeveloper per parlare con il database.

Prerequisiti

Per poter lavorare con gli esempi di codice illustrati in questo articolo, dovresti avere installato quanto segue nel tuo sistema:

  • Visual Studio 2019 Community Edition (scarica)
  • dotConnect per PostgreSQL (scarica)
  • Sviluppatore di entità

Puoi scaricare una copia di Entity Developer (versione di prova) da qui:https://www.devart.com/entitydeveloper/download.html.

Crea un database

Ora che il progetto API Web ASP.NET Core è stato creato in Visual Studio 2019; il passo successivo è creare il database. Nota che per semplicità useremo un database con alcune due tabelle con design semplici in questo esempio. Crea un database chiamato Demo e crea tre tabelle (Persona, Utente e Manager) al suo interno. I campi in queste tabelle dovrebbero essere mappati con le proprietà delle classi del modello mostrate più avanti in questo articolo.

Crea un nuovo progetto API Web ASP.NET Core

Supponendo che il software necessario sia stato installato sul tuo computer per poter lavorare con Entity Developer, segui i passaggi descritti di seguito per creare un nuovo progetto API Web ASP.NET Core.

1. Innanzitutto, apri l'IDE di Visual Studio 2019.
2. Quindi, fai clic su Crea un nuovo progetto una volta caricato l'IDE.
3. Fai clic su Crea un nuovo progetto .
4. Quindi, seleziona Applicazione Web ASP.NET Core .
5. Fare clic su Avanti .
6. Specificare il nome e la posizione del progetto, dove dovrebbe essere archiviato nel sistema.
7. Facoltativamente, fai clic su Posiziona la soluzione e il progetto nella stessa directory casella di controllo.
8. Successivamente, fai clic su Crea .
9. In Crea una nuova applicazione Web ASP.NET Core finestra di dialogo visualizzata di seguito, seleziona API come modello di progetto.
10. Selezionare ASP.NET Core 3.1 o successivo come versione.
11. Devi disabilitare la Configura per HTTPS e Abilita supporto Docker opzioni disabilitando le rispettive caselle di controllo.
12. Poiché in questo esempio non utilizzeremo l'autenticazione, specifica l'autenticazione come Nessuna autenticazione .
13. Infine, fai clic su Crea pulsante per terminare il processo.

Crea un Entity Data Model

La prossima cosa da fare è creare un modello di dati entità. Quando crei un modello in Entity Developer, ci sono due opzioni tra cui scegliere:Database First (questo è selezionato per impostazione predefinita) e Model First. In questo esempio, sfrutteremo l'approccio Database First. Ricordati di selezionare Genera dal database opzione per generare il tuo modello dal database e selezionare gli oggetti del database che vorresti facessero parte del tuo modello di dati entità.

Segui questi passaggi descritti di seguito per creare un modello di dati entità in Entity Developer utilizzando l'approccio basato sul database.

1. Seleziona il tuo progetto in Esplora soluzioni Finestra.
2. Fare clic con il pulsante destro del mouse e selezionare Aggiungi>Nuovo articolo .
3. Seleziona Devart EF Core Model come modello come mostrato di seguito.

4. Specifica un nome per il tuo modello di dati entità e fai clic su Aggiungi .
5. Specificare le proprietà della connessione e testare la connessione.
6. Fare clic su Avanti continuare.
7. Per impostazione predefinita, verrà selezionata l'opzione "Genera da database". Poiché vogliamo che il modello venga creato dal database, fare clic su Avanti continuare.
8. Deselezionare tutte le opzioni e quindi specificare solo gli oggetti del database che si desidera far parte del modello. Qui è dove dovresti selezionare le tabelle Prodotti e Categorie.
9. Nella Impostazione regole di denominazione schermata, puoi facoltativamente specificare regole di denominazione per le tue entità.
10. Nella schermata successiva è possibile specificare facoltativamente le proprietà del modello.
11. Nella schermata successiva è possibile scegliere facoltativamente il contenuto del diagramma del modello.
12. Nella schermata successiva è possibile specificare facoltativamente i modelli di generazione del codice.
13. Specifica il modello di generazione del codice di tua scelta.
14. Infine, fai clic su Fine per completare il processo.

Il tuo Entity Data Model ADO.NET che utilizza Entity Developer verrà creato insieme al contesto dei dati e alle classi del modello.

Ereditarietà in Entity Framework Core

Entity Framework Core (EF Core) consente di eseguire il mapping di una gerarchia di classi .NET a un database. Pertanto, puoi creare le tue entità .NET rappresentate come tipi di base e derivati ​​e EF Core può generare lo schema del database per te. Tuttavia, poiché EF Core non cerca automaticamente le classi di base o derivate, è necessario dichiarare in modo esplicito un tipo CLR nel modello se si desidera che venga mappato. Va notato che specificare solo il tipo di base non sarà sufficiente, ovvero non forzerà automaticamente EF Core a includere tutti i sottotipi.

L'elenco di codice seguente illustra come creare un contesto dati personalizzato per una classe e la sua sottoclasse.

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; }
}

Tabella per gerarchia (TPH)

Nel tipo di ereditarietà Tabella per gerarchia (TPH) (questo è il tipo di ereditarietà predefinito in EF Core), avresti una sola tabella per l'intera gerarchia per rappresentare tutte le classi. Per differenziare tra i diversi tipi, viene utilizzata una colonna "discriminatore". Per impostazione predefinita, la tabella prende il nome dalla classe base o da un campo DbSet ad essa collegato. Il nome della tabella sarebbe il nome della classe base o il suo attributo DbSet corrispondente per impostazione predefinita.

Il frammento di codice seguente illustra come rappresentare la tabella per gerarchia:

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; }
    }

Tabella per tipo (TPT)

Le relazioni di ereditarietà dell'approccio Table Per Type (TPT) sono rappresentate come chiavi esterne. In questo approccio, una tabella separata rappresenta ogni tipo (compresi i tipi astratti) della catena di ereditarietà. Le chiavi esterne vengono utilizzate per collegare le tabelle che rappresentano i tipi di tipo derivato con il relativo tipo di base. In questa strategia, EF Core crea una tabella di base nel database e più tabelle specifiche per ogni tipo derivato.

L'elenco di codice seguente mostra come è possibile implementare l'approccio Table Per Type (TPT):

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; }
}

Tabella per tipo di calcestruzzo (TPC)

Nell'approccio Table Per Concrete Type (TPC), ogni tipo concreto nella catena di ereditarietà è rappresentato da una tabella distinta nel database ma non dalla classe astratta. Le proprietà di qualsiasi tipo di base astratta vengono create come campi nella tabella di ogni tipo di calcestruzzo.

Il design della classe sarà lo stesso di TPH. Ecco come specificare una tabella per ciascuna delle sottoclassi:

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");
        });
    }
}

Riepilogo

Entity Framework Core può essere eseguito su qualsiasi piattaforma che supporta .NET Standard 2.1. Ciò include .NET Core 3.1 e .NET 5. Tuttavia, non verrà eseguito su .NET Standard 2.0, il che implica che a partire da EF Core 5.0, non sarà possibile sfruttare EF Core con .NET Framework. Buona lettura!