es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problema con el concepto de alcance en la inyección de dependencias al utilizar EF.

Tengo un problema con el concepto de ámbito en la inyección de dependencias. He registrado mi contexto de base de datos como ámbito y guardo la actividad del usuario en una tabla utilizando un método asíncrono sin usar “await”.

// En Startup:

services.AddScoped<idbcontext, storagesystemdbcontext=””>();

services.AddScoped<iuseractivityservice, useractivityservice=””>();

// En UserActivityService:

public async void LogUserActivityAsync(string controllerName, string actionName, ActionType actionType = ActionType.View, string data = “”, string description = “”)
{
await InsertAsync(new UserActivity
{
ControllerName = controllerName,
ActionName = actionName,
ActionType = actionType,
CreatedDateTime = DateTime.Now,
Description = description,
UserId = (await _workContext.CurrentUserAsync())?.Id
});
}

// En Controlador:

_userActivityService.LogUserActivityAsync(NombreControladorActual, NombreAccionActual, datos);

Recibo el siguiente error cuando llamo a la misma acción dos veces inmediatamente:

InvalidOperationException: Se inició una segunda operación en este contexto antes de que se completara una operación anterior. Esto suele ser causado por hilos diferentes que usan simultáneamente la misma instancia de DbContext. Para obtener más información sobre cómo evitar problemas de threading con DbContext, consulte https://go.microsoft.com/fwlink/?linkid=2097913.

Esperaba que se creara un nuevo contexto de base de datos con la segunda solicitud, dependiendo del tipo de registro de dependencia del contexto de base de datos, pero según este error, no se creó un nuevo contexto para la segunda solicitud y se utilizó el anterior.

¿Cuál es la razón de esto?

Estoy utilizando Asp Net.Core MVC y EF en .Net Core 5.</iuseractivityservice,></idbcontext,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón de este error es que la instancia de DbContext está acotada a la duración del ámbito desde el cual se llama, que en este caso es el ámbito de la petición. Esto significa que se reutiliza la misma instancia de DbContext durante toda la duración de la petición. Cuando se realiza una segunda petición a la misma acción de manera inmediata, el DbContext todavía está en uso desde la petición anterior y no se puede utilizar para la nueva petición hasta que la anterior se complete. Esto se conoce como un problema de concurrencia y puede causar problemas al acceder a recursos compartidos desde múltiples hilos.

    Para resolver este problema, debes evitar hacer llamadas asíncronas sin utilizar la palabra clave “await”. En su lugar, debes asegurarte de que las llamadas asíncronas se esperen antes de realizar cualquier otra llamada asíncrona en la misma instancia de DbContext. Otra solución sería registrar el DbContext como un servicio Transitorio en lugar de un servicio Acotado, lo cual crearía una nueva instancia de DbContext para cada petición. Sin embargo, este enfoque puede causar problemas de rendimiento debido a la creación y eliminación excesivas de instancias de DbContext, por lo que se debe utilizar con precaución.

Comments are closed.