Database
 sql >> Base de Dados >  >> RDS >> Database

Como trabalhar com herança no Entity Framework Core


O Entity Framework Core da Microsoft é uma versão multiplataforma, leve e flexível de seu antecessor, o Entity Framework. O EF Core é uma ferramenta de mapeador relacional de objeto (ORM) que oferece uma maneira padronizada de armazenar e recuperar dados de e para diversas fontes de dados.

Programando contra um modelo conceitual em vez de um modelo relacional. Como resultado, não há incompatibilidade de impedância entre como os dados são representados no aplicativo e como são armazenados no banco de dados.

Herança é um recurso da Programação Orientada a Objetos que permite criar subclasses de uma classe base, estendendo assim os recursos da classe base. O Entity Framework Corefornece excelente suporte para herança. Este artigo fala sobre como podemos implementar a herança no Entity Framework Core. Aproveitaremos o EntityDeveloper para conversar com o banco de dados.

Pré-requisitos


Para poder trabalhar com os exemplos de código demonstrados neste artigo, você deve ter o seguinte instalado em seu sistema:
  • Visual Studio 2019 Community Edition (download)
  • dotConnect para PostgreSQL (baixar)
  • Desenvolvedor de entidade

Você pode baixar uma cópia do Entity Developer (versão de avaliação) aqui:https://www.devart.com/entitydeveloper/download.html.

Criar um banco de dados


Agora que o projeto ASP.NET Core Web API foi criado no Visual Studio 2019; o próximo passo é criar o banco de dados. Observe que, para simplificar, usaremos um banco de dados com algumas duas tabelas com designs simples neste exemplo. Crie um banco de dados chamado Demo e crie três tabelas (Person, User e Manager) nele. Os campos nessas tabelas devem ser mapeados com as propriedades das classes de modelo mostradas posteriormente neste artigo.

Criar um novo projeto de API Web ASP.NET Core


Supondo que o software necessário tenha sido instalado em seu computador para poder trabalhar com o Entity Developer, siga as etapas descritas abaixo para criar um novo projeto de API Web ASP.NET Core.

1. Primeiro, abra o IDE do Visual Studio 2019.
2. Em seguida, clique em Criar um novo projeto uma vez que o IDE foi carregado.
3. Clique em Criar um novo projeto .
4. Em seguida, selecione Aplicativo Web ASP.NET Core .
5. Clique em Avançar .
6. Especifique o nome e o local do projeto – onde ele deve ser armazenado em seu sistema.
7. Opcionalmente, clique em Colocar solução e projeto no mesmo diretório caixa de seleção.
8. Em seguida, clique em Criar .
9. Em Criar um novo aplicativo Web ASP.NET Core janela de diálogo que é mostrada a seguir, selecione API como modelo de projeto.
10. Selecione ASP.NET Core 3.1 ou posterior como a versão.
11. Você deve desativar o Configurar para HTTPS e Ativar suporte ao Docker opções desativando as respectivas caixas de seleção.
12. Como não usaremos autenticação neste exemplo, especifique a autenticação como Sem autenticação .
13. Por fim, clique no botão Criar botão para finalizar o processo.

Criar um modelo de dados de entidade


A próxima coisa que você deve fazer é criar um modelo de dados de entidade. Quando você cria um modelo no Entity Developer, há duas opções para escolher:Database First (este é selecionado por padrão) e Model First. Neste exemplo, aproveitaremos a abordagem Database First. Lembre-se de selecionar Gerar do banco de dados opção para gerar seu modelo a partir do banco de dados e selecionar os objetos de banco de dados que você gostaria que fizessem parte de seu modelo de dados de entidade.

Siga estas etapas descritas abaixo para criar um modelo de dados de entidade no Entity Developer usando a abordagem de banco de dados em primeiro lugar.

1. Selecione seu projeto no Solution Explorer Janela.
2. Clique com o botão direito do mouse e selecione Adicionar>Novo item .
3. Selecione Modelo Devart EF Core como o modelo como mostrado abaixo.

4. Especifique um nome para seu modelo de dados de entidade e clique em Adicionar .
5. Especifique as propriedades da conexão e teste a conexão.
6. Clique em Avançar continuar.
7. Por padrão, a opção “Gerar do Banco de Dados” estará selecionada. Como queremos que o modelo seja criado a partir do banco de dados, clique em Avançar continuar.
8. Desmarque todas as opções e especifique apenas os objetos de banco de dados que você gostaria que fizessem parte do modelo. Aqui é onde você deve selecionar as tabelas Produtos e Categorias.
9. Na Configuração regras de nomenclatura tela, você pode opcionalmente especificar regras de nomenclatura para suas entidades.
10. Na próxima tela você pode opcionalmente especificar as propriedades do modelo.
11. Na próxima tela você pode opcionalmente escolher o conteúdo do diagrama do modelo.
12. Na próxima tela você pode opcionalmente especificar modelos de geração de código.
13. Especifique o modelo de geração de código de sua escolha.
14. Por fim, clique em Concluir para concluir o processo.

Seu modelo de dados de entidade ADO.NET usando o Entity Developer será criado junto com o contexto de dados e as classes de modelo.

Herança no Entity Framework Core


O Entity Framework Core (EF Core) permite mapear uma hierarquia de classes .NET para um banco de dados. Portanto, você pode criar suas entidades .NET representadas como os tipos base e derivados, e o EF Core pode gerar o esquema de banco de dados para você. No entanto, como o EF Core não procura automaticamente classes base ou derivadas, você deve declarar explicitamente um tipo CLR em seu modelo se quiser que ele seja mapeado. Deve-se observar que especificar apenas o tipo base não será suficiente, ou seja, não forçará automaticamente o EF Core a incluir todos os subtipos.

A listagem de código a seguir ilustra como você pode criar um contexto de dados personalizado para uma classe, bem como sua subclasse.
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; }
}

Tabela por hierarquia (TPH)


No tipo de herança Table Per Hierarchy (TPH) (este é o tipo de herança padrão no EF Core), você teria apenas uma tabela para toda a hierarquia para representar todas as classes. Para diferenciar entre os diferentes tipos, uma coluna “discriminadora” é usada. Por padrão, a tabela recebe o nome da classe base ou de um campo DbSet vinculado a ela. O nome da tabela seria o nome da classe base ou seu atributo DbSet correspondente por padrão.

O snippet de código a seguir ilustra como a tabela por hierarquia pode ser representada:
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; }
    }

Tabela por tipo (TPT)


Os relacionamentos de herança da abordagem de tabela por tipo (TPT) são descritos como chaves estrangeiras. Nesta abordagem, uma tabela separada representa cada tipo (incluindo tipos abstratos) da cadeia de herança. As chaves estrangeiras são usadas para vincular tabelas que representam tipos de tipo derivados com seu tipo base. Nessa estratégia, o EF Core cria uma tabela base no banco de dados e várias tabelas específicas para cada tipo derivado.

A listagem de código a seguir mostra como a abordagem Table Per Type (TPT) pode ser implementada:
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; }
}

Tabela por tipo de concreto (TPC)


Na abordagem Table Per Concrete Type (TPC), cada tipo concreto na cadeia de herança é representado por uma tabela distinta no banco de dados, mas não pela classe abstrata. As propriedades de qualquer tipo base abstrato são criadas como campos na tabela de cada tipo concreto.

O design da classe será o mesmo do TPH. Veja como você pode especificar uma tabela para cada uma das subclasses:
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");
        });
    }
}

Resumo


O Entity Framework Core pode ser executado em qualquer plataforma que dê suporte ao .NET Standard 2.1. Isso inclui o .NET Core 3.1, bem como o .NET 5. No entanto, ele não será executado no .NET Standard 2.0, o que implica que, a partir do EF Core 5.0, você não poderá aproveitar o EF Core com o .NET Framework. Leitura feliz!