Entity Framework Core es un asignador relacional de objetos, u ORM, que aísla el modelo de objetos de su aplicación del modelo de datos. Eso le permite escribir código que realiza operaciones CRUD sin preocuparse por cómo se almacenan los datos. En otras palabras, trabaja con los datos utilizando objetos .NET familiares. En Entity Framework Core, DbContext conecta las clases de dominio a la base de datos actuando como un puente entre ellas. Puede aprovechar DbContext para consultar datos en sus entidades o guardar sus entidades en la base de datos subyacente. Hablé sobre los conceptos básicos de DbContext en un artículo anterior. En este artículo profundizaremos en DbContext con un poco más de detalle, analizaremos la vida útil de DbContext y ofreceremos algunas prácticas recomendadas para usar DbContext en Entity Framework Core. EF Core le permite crear una instancia de DbContext de varias maneras. Examinaremos algunas de las opciones. Para utilizar los ejemplos de código proporcionados en este artículo, debe tener Visual Studio 2022 instalado en su sistema. Si aún no tiene una copia, puede descargar Visual Studio 2022 aquí. Cree un proyecto de API web ASP.NET Core en Visual Studio 2022 Para crear un proyecto de API web ASP.NET Core 8 en Visual Studio 2022, siga los pasos descritos abajo. Inicie el IDE de Visual Studio 2022. Haga clic en «Crear nuevo proyecto». En la ventana «Crear nuevo proyecto», seleccione «ASP.NET Core Web API» de la lista de plantillas que se muestran. Haga clic en Siguiente. En la ventana «Configura tu nuevo proyecto», especifica el nombre y la ubicación del nuevo proyecto. Opcionalmente, marque la casilla de verificación «Colocar solución y proyecto en el mismo directorio», según sus preferencias. Haga clic en Siguiente. En la ventana «Información adicional» que se muestra a continuación, seleccione «.NET 8.0 (soporte a largo plazo)» como versión del marco y asegúrese de que la casilla «Usar controladores» no esté marcada. Usaremos API mínimas en este proyecto. En otra parte de la ventana «Información adicional», deje el «Tipo de autenticación» configurado en «Ninguno» (el valor predeterminado) y asegúrese de que las casillas de verificación «Habilitar soporte de API abierta», «Configurar para HTTPS» y «Habilitar Docker» permanezcan sin marcar. No utilizaremos ninguna de esas funciones aquí. Haga clic en Crear. Usaremos este proyecto ASP.NET Core Web API para trabajar con DbContext en las secciones siguientes. ¿Qué es DbContext? ¿Por qué es necesario? Cuando se trabaja con Entity Framework Core, DbContext representa una sesión de conexión con la base de datos. Funciona como una unidad de trabajo, lo que permite a los desarrolladores monitorear y controlar los cambios realizados en las entidades antes de guardarlos en la base de datos. Usamos DbContext para recuperar datos de nuestras entidades o conservar nuestras entidades en la base de datos. La clase DbContext en EF Core se adhiere a los patrones de Unidad de trabajo y Repositorio. Proporciona una forma de encapsular la lógica de la base de datos dentro de la aplicación, lo que facilita el trabajo con la base de datos y mantiene la reutilización del código y la separación de preocupaciones. DbContext en EF Core tiene una serie de responsabilidades: Administrar conexiones Consultar datos de la base de datos Guardar datos en la base de datos Control de concurrencia Seguimiento de cambios Almacenamiento en caché Gestión de transacciones La vida útil de DbContext La clase DbContext en Entity Framework Core juega un papel crucial para facilitar la conexión entre la aplicación y la base de datos, brindando soporte para el acceso a datos, seguimiento de cambios y gestión de transacciones. La vida útil de una instancia de DbContext comienza cuando se crea una instancia y finaliza cuando se elimina. A continuación se muestra la secuencia de eventos en una unidad de trabajo típica con EF Core: Se crea una instancia de DbContext. Las entidades se rastrean utilizando esta instancia. Se realizan cambios en las entidades rastreadas. Se invoca el método SaveChanges para almacenar las entidades en la memoria en la base de datos subyacente. El objeto DbContext se elimina o se recolecta como basura cuando la aplicación ya no lo necesita. Evite el uso de DbContext al usar declaraciones. Una instancia de DbContext debe eliminarse cuando ya no sea necesaria para liberar recursos no administrados y evitar pérdidas de memoria. Sin embargo, no es una práctica recomendada eliminar instancias de DbContext explícitamente o usar DbContext dentro de una declaración de uso. He aquí por qué no debe deshacerse de sus instancias de DbContext: cuando se deshace de un objeto DbContext, es posible que tenga una o más entidades que no se pueden guardar en la base de datos. Crear instancias y liberar objetos DbContext puede resultar costoso, principalmente al configurar una nueva conexión de base de datos. Eliminar el DbContext dentro de un bloque de uso después de cada uso puede generar una sobrecarga evitable y un rendimiento reducido. Desechar el objeto DbContext cuando hay modificaciones pendientes en la base de datos o cuando aún espera utilizar el contexto puede provocar problemas o comportamientos inesperados. La eliminación prematura de las instancias de DbContext puede interferir con el seguimiento de cambios, lo que dificulta o imposibilita la realización de más actualizaciones o consultas. En lugar de utilizar bloques para deshacerse de las instancias de DbContext en su aplicación, considere aprovechar la inyección de dependencia para administrar su vida útil. El uso de la inyección de dependencia garantizará que DbContext se cree y elimine de manera adecuada, según el ciclo de vida de la aplicación o el alcance de la operación. Cree una nueva instancia de DbContext en EF Core. No existe una regla específica para crear una instancia de DbContext. Los requisitos de su solicitud deben determinar qué enfoque adoptará. Cada uno de los enfoques que se ilustran a continuación tiene sus casos de uso específicos; ninguno de ellos es mejor que los demás. Puede ampliar la clase DbContext en EF Core para crear su propia clase DbContext como se muestra a continuación. clase pública IDGDbContext: DbContext {Aplicación públicaDbContext(DbContextOptions opciones): base(opciones) { } }De manera similar, puede crear una instancia de una clase DbContextOptionsBuilder y luego usar esta instancia para crear una instancia de DbContextOptions. Esta instancia de DbContextOptions podría pasarse al constructor de DbContext. Este enfoque le ayuda a crear explícitamente una instancia de DbContext. Utilice la inyección de dependencia para crear instancias de DbContext. Como alternativa, puede crear instancias de DbContext mediante inyección de dependencia (DI) configurando su instancia de DbContext utilizando el método AddDbContext como se muestra a continuación.services.AddDbContext( opciones => opciones.UseSqlServer(«name=ConnectionStrings:DefaultConnection»)); Luego puede aprovechar la inyección del constructor en su controlador para recuperar una instancia de DbContext como se muestra a continuación.public class IDGController { private readonly IDGDbContext _dbContext; IDGController público (IDGDbContext dbContext) { _dbContext = dbContext; } }Normalmente, un ciclo de solicitud-respuesta HTTP representa una unidad de trabajo en aplicaciones web. Con DI, podemos crear una instancia de DbContext para cada solicitud y eliminarla cuando finalice esa solicitud. Prefiero usar un contenedor DI para crear instancias y configurar DbContext porque el contenedor DI administra las instancias y la duración de DbContext por usted, aliviandolo de la molestia de administrar estas instancias explícitamente. Inicialice DbContext en el método OnConfiguring. Una tercera opción es crear una instancia de DbContext anulando el método OnConfiguring en su clase DbContext personalizada. Luego puede aprovechar el constructor DbContext para pasar información de configuración, como una cadena de conexión. El siguiente fragmento de código muestra cómo puede inicializar DbContext en el método OnConfiguring de su clase DbContext personalizada.clase pública IDGDbContext: DbContext { protected override void OnConfiguring (DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(«Especifique aquí la cadena de conexión de su base de datos.»); } }Registrar una fábrica para crear una instancia de DbContext. También puede crear una instancia de DbContext usando una fábrica. Una fábrica resulta útil cuando su aplicación necesita realizar múltiples unidades de trabajo dentro de un alcance particular. En este caso, puede usar el método AddDbContextFactory para registrar una fábrica y crear sus objetos DbContext como se muestra en el fragmento de código que se proporciona a continuación. AgregarDbContextFactory(opciones => opciones.UseSqlServer(«Especifique aquí la cadena de conexión de su base de datos.»)); Luego puede usar la inyección de constructor en su controlador para construir instancias de DbContext como se muestra a continuación.private readonly IDbContextFactory _dbContextFactory; IDGController público (IDbContextFactory dbContextFactory) { _dbContextFactory = dbContextFactory; }Puede activar el registro de datos confidenciales para incluir datos de la aplicación cuando se registran excepciones en su aplicación. El siguiente fragmento de código muestra cómo se puede hacer esto.optionsBuilder .EnableSensitiveDataLogging() .UseSqlServer(«Especifique aquí la cadena de conexión de su base de datos.»);Finalmente, tenga en cuenta que no se pueden ejecutar varias operaciones paralelas simultáneamente en la misma instancia de DbContext. Esto se refiere tanto a la ejecución paralela de consultas asíncronas como a cualquier uso explícito de varios subprocesos de la instancia simultáneamente. Por lo tanto, se recomienda realizar operaciones paralelas utilizando instancias separadas de DbContext. Además, nunca debe compartir instancias de DbContext entre subprocesos porque no es seguro para subprocesos. Copyright © 2024 IDG Communications, Inc.

Source link