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.

“RoleManager.FindByIdAsync” arroja la excepción: “El DataReader asociado con esta conexión debe cerrarse primero”.

Siguiendo este tutorial sobre Roles, me sale esta excepción:

Ya hay un DataReader abierto asociado a esta conexión que debe cerrarse primero.

que está relacionado con esta línea:

IdentityRole role = await roleManager.FindByIdAsync(Role);

Mi proyecto contiene una vista con un atributo que activa un tag-helper:

<td i-role="@role.Id"></td>

Aquí está la parte del tag-helper que causa un problema:

public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        List<string> names = new List<string>();
        IdentityRole role = await roleManager.FindByIdAsync(Role);
        if (role != null)
        {
            foreach (var user in userManager.Users)
            {
                if (user != null && await userManager.IsInRoleAsync(user, role.Name))
                    names.Add(user.UserName);
            }
        }
        output.Content.SetContent(names.Count == 0 ? "No Users" : string.Join(", ", names));
    }

Comprobé con el depurador si Role es la id correcta dada y efectivamente es la id correcta

IdentityRole role = await roleManager.FindByIdAsync(Role);

Así que no entiendo dónde está el problema… ¿Podrías ayudarme por favor?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La excepción “Ya hay un DataReader abierto asociado a esta conexión que debe cerrarse primero” se produce cuando se intenta ejecutar otra consulta en una conexión mientras aún está abierta una existente. En este caso, es probable que el problema se deba a que la colección userManager.Users todavía se está enumerando cuando se llama al método FindByIdAsync, lo que abrió un nuevo DataReader.

    Para solucionar este problema, puede intentar forzar la colección userManager.Users a ser completamente enumerada antes de llamar al método FindByIdAsync. Una forma de hacerlo es crear una nueva lista a partir de la colección antes de iterar sobre ella, como se muestra a continuación:

    List<applicationuser> users = new List<applicationuser>(userManager.Users);
    foreach (var user in users)
    

    Esto debería asegurar que la colección userManager.Users se cargue por completo antes de ejecutar el método FindByIdAsync, lo que debería evitar la excepción “DataReader ya abierto”.

    Alternativamente, puede intentar deshabilitar los conjuntos de resultados activos múltiples (MARS) en su cadena de conexión. Esto se puede hacer agregando el parámetro “MultipleActiveResultSets=False” a su cadena de conexión:

    "Data Source=your_server;Initial Catalog=your_database;Integrated Security=True;MultipleActiveResultSets=False"
    

    Deshabilitar MARS evitará que se ejecuten múltiples consultas en la misma conexión al mismo tiempo, lo que también debería evitar la excepción “DataReader ya abierto”.

    ¡Espero que esto ayude! Avíseme si tiene alguna otra pregunta.

Comments are closed.