Obtener la conexión no es compatible con MultipleActiveResultSets cuando se utiliza Dapper.SimpleCRUD en un forEach

c# dapper dapper-simplecrud foreach sql-server

Pregunta

Tengo el siguiente código:

var test = new FallEnvironmentalCondition[] {
    new FallEnvironmentalCondition {Id=40,FallId=3,EnvironmentalConditionId=1},
    new FallEnvironmentalCondition {Id=41,FallId=3,EnvironmentalConditionId=2},
    new FallEnvironmentalCondition {Id=42,FallId=3,EnvironmentalConditionId=3}
};
test.ToList().ForEach(async x => await conn.UpdateAsync(x));

Estoy obteniendo el

InvalidOperationException: la conexión no admite MultipleActiveResultSets

No entiendo que estoy await cada actualización, ¿por qué recibo este error?

Nota: no tengo control sobre la cadena de conexión, así que no puedo activar MARS.

Respuesta aceptada

Ese código inicia una Tarea para cada elemento en la lista, pero no espera a que cada tarea se complete antes de comenzar la siguiente. Dentro de cada Tarea, espera que se complete la actualización. Tratar

 Enumerable.Range(1, 10).ToList().ForEach(async i => await Task.Delay(1000).ContinueWith(t => Console.WriteLine(DateTime.Now)));

Lo cual es equivalente a

    foreach (var i in Enumerable.Range(1, 10).ToList() )
    {
        var task = Task.Delay(1000).ContinueWith(t => Console.WriteLine(DateTime.Now));
    }

Si utiliza un método no asíncrono, deberá esperar (), no esperar cada tarea. P.EJ

    foreach (var i in Enumerable.Range(1, 10).ToList() )
    {
        var task = Task.Delay(1000).ContinueWith(t => Console.WriteLine(DateTime.Now));
        //possibly do other stuff on this thread
        task.Wait(); //wait for this task to complete
    }

Respuesta popular

Debe agregar el atributo MultipleActiveResultSets en la cadena de conexión y configurarlo en true para permitir múltiples conjuntos de resultados activos.

 "Data Source=MSSQL1;" & _  
    "Initial Catalog=AdventureWorks;Integrated Security=SSPI;" & _  
    "MultipleActiveResultSets=True"  

Obtenga más información en: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/enabling-multiple-active-result-sets



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué