sql >> Base de Datos >  >> RDS >> Database

Cómo trabajar con herencia en Entity Framework Core

Entity Framework Core de Microsoft es una versión multiplataforma, liviana y flexible de su predecesor, Entity Framework. EF Core es una herramienta de mapeo relacional de objetos (ORM) que ofrece una forma estandarizada de almacenar y recuperar datos hacia y desde diversas fuentes de datos.

Programando contra un modelo conceptual más que relacional. Como resultado, no hay discrepancia de impedancia entre cómo se representan los datos en la aplicación y cómo se almacenan en la base de datos.

La herencia es una característica de la Programación Orientada a Objetos que le permite crear subclases a partir de una clase base, extendiendo así las características de la clase base. Entity Framework Core proporciona un excelente soporte para la herencia. Este artículo habla sobre cómo podemos implementar la herencia en Entity Framework Core. Aprovecharemos EntityDeveloper para hablar con la base de datos.

Requisitos previos

Para poder trabajar con los ejemplos de código que se muestran en este artículo, debe tener lo siguiente instalado en su sistema:

  • Visual Studio 2019 Community Edition (descargar)
  • dotConnect para PostgreSQL (descargar)
  • Desarrollador de entidades

Puede descargar una copia de Entity Developer (versión de prueba) desde aquí:https://www.devart.com/entitydeveloper/download.html.

Crear una base de datos

Ahora que el proyecto ASP.NET Core Web API se ha creado en Visual Studio 2019; el siguiente paso es crear la base de datos. Tenga en cuenta que, en aras de la simplicidad, usaremos una base de datos con algunas dos tablas con diseños simples en este ejemplo. Cree una base de datos llamada Demo y cree tres tablas (Persona, Usuario y Administrador) en ella. Los campos de estas tablas deben corresponder con las propiedades de las clases de modelo que se muestran más adelante en este artículo.

Cree un nuevo proyecto de API web de ASP.NET Core

Suponiendo que se haya instalado el software necesario en su computadora para poder trabajar con Entity Developer, siga los pasos que se describen a continuación para crear un nuevo proyecto de ASP.NET Core Web API.

1. En primer lugar, abra el IDE de Visual Studio 2019.
2. A continuación, haga clic en Crear un nuevo proyecto una vez que se haya cargado el IDE.
3. Haz clic en Crear un nuevo proyecto .
4. A continuación, seleccione Aplicación web ASP.NET Core. .
5. Haga clic en Siguiente .
6. Especifique el nombre y la ubicación del proyecto, donde debe almacenarse en su sistema.
7. Opcionalmente, haga clic en Colocar la solución y el proyecto en el mismo directorio caja.
8. A continuación, haga clic en Crear .
9. En Crear una nueva aplicación web ASP.NET Core ventana de diálogo que se muestra a continuación, seleccione API como plantilla de proyecto.
10. Seleccione ASP.NET Core 3.1 o posterior como versión.
11. Debes deshabilitar la Configuración para HTTPS y Habilitar compatibilidad con Docker opciones deshabilitando las casillas respectivas.
12. Dado que no usaremos la autenticación en este ejemplo, especifique la autenticación como Sin autenticación .
13. Finalmente, haga clic en Crear botón para finalizar el proceso.

Crear un modelo de datos de entidad

Lo siguiente que debe hacer es crear un modelo de datos de entidad. Cuando crea un modelo en Entity Developer, hay dos opciones para elegir:Base de datos primero (esto está seleccionado de forma predeterminada) y Modelo primero. En este ejemplo, aprovecharemos el enfoque Database First. Recuerde seleccionar Generar desde base de datos opción para generar su modelo a partir de la base de datos y seleccionar los objetos de la base de datos que le gustaría que formaran parte de su modelo de datos de entidad.

Siga estos pasos que se describen a continuación para crear un modelo de datos de entidad en Entity Developer utilizando el enfoque de base de datos primero.

1. Seleccione su proyecto en el Explorador de soluciones Ventana.
2. Haga clic derecho y seleccione Agregar>Artículo nuevo .
3. Seleccione Modelo Devart EF Core como la plantilla como se muestra a continuación.

4. Especifique un nombre para el modelo de datos de su entidad y haga clic en Agregar .
5. Especifique las propiedades de conexión y pruebe la conexión.
6. Haga clic en Siguiente continuar.
7. Por defecto, la opción “Generar desde base de datos” estará seleccionada. Dado que queremos que el modelo se cree a partir de la base de datos, haga clic en Siguiente continuar.
8. Anule la selección de todas las opciones y luego especifique solo los objetos de la base de datos que le gustaría que fueran parte del modelo. Aquí es donde debe seleccionar las tablas Productos y Categorías.
9. En la Configuración reglas de nomenclatura pantalla, puede especificar opcionalmente reglas de nomenclatura para sus entidades.
10. En la pantalla siguiente, puede especificar opcionalmente las propiedades del modelo.
11. En la siguiente pantalla, puede elegir opcionalmente el contenido del diagrama del modelo.
12. En la pantalla siguiente, puede especificar opcionalmente plantillas de generación de código.
13. Especifique la plantilla de generación de código de su elección.
14. Por último, haga clic en Finalizar para completar el proceso.

Su modelo de datos de entidad de ADO.NET mediante Entity Developer se creará junto con el contexto de datos y las clases de modelo.

Herencia en Entity Framework Core

Entity Framework Core (EF Core) le permite asignar una jerarquía de clases .NET a una base de datos. Por lo tanto, puede crear sus entidades .NET representadas como tipos base y derivados, y EF Core puede generar el esquema de la base de datos por usted. Sin embargo, dado que EF Core no busca automáticamente clases base o derivadas, debe declarar explícitamente un tipo CLR en su modelo si desea que se asigne. Cabe señalar que especificar solo el tipo base no será suficiente, es decir, no obligará automáticamente a EF Core a incluir todos los subtipos.

La siguiente lista de código ilustra cómo puede crear un contexto de datos personalizado para una clase y su subclase.

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

Tabla por jerarquía (TPH)

En el tipo de herencia Tabla por jerarquía (TPH) (este es el tipo de herencia predeterminado en EF Core), solo tendría una tabla para toda la jerarquía para representar todas las clases. Para diferenciar entre diferentes tipos, se utiliza una columna de "discriminador". De forma predeterminada, la tabla lleva el nombre de la clase base o un campo DbSet vinculado con ella. El nombre de la tabla sería el nombre de la clase base o su atributo DbSet correspondiente por defecto.

El siguiente fragmento de código ilustra cómo se puede representar la tabla por jerarquía:

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

Tabla por tipo (TPT)

Las relaciones de herencia de enfoque de tabla por tipo (TPT) se representan como claves externas. En este enfoque, una tabla separada representa cada tipo (incluidos los tipos abstractos) de la cadena de herencia. Las claves foráneas se utilizan para vincular tablas que representan tipos de tipos derivados con su tipo base. En esta estrategia, EF Core crea una tabla base en la base de datos y varias tablas específicas para cada tipo derivado.

La siguiente lista de código muestra cómo se puede implementar el enfoque de tabla por tipo (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; }
}

Tabla por Tipo de Concreto (TPC)

En el enfoque de tabla por tipo concreto (TPC), cada tipo concreto en la cadena de herencia está representado por una tabla distinta en la base de datos pero no por la clase abstracta. Las propiedades de cualquier tipo base abstracto se crean como campos en la tabla de cada tipo concreto.

El diseño de la clase será el mismo que TPH. Así es como puede especificar una tabla para cada una de las subclases:

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

Resumen

Entity Framework Core se puede ejecutar en cualquier plataforma que admita .NET Standard 2.1. Esto incluye .NET Core 3.1 y .NET 5. Sin embargo, no se ejecutará en .NET Standard 2.0, lo que implica que, a partir de EF Core 5.0, no podrá aprovechar EF Core con .NET Framework. ¡Feliz lectura!