2017-09-11 4 views
2

Je le code suivant:La connexion ne prend pas en charge MultipleActiveResultSets lors de l'utilisation Dapper.SimpleCRUD dans un forEach

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

Je reçois le

InvalidOperationException: La connexion ne supporte pas MultipleActiveResultSets

Je ne comprends pas Je suis await chaque mise à jour J'ai cette erreur.

Remarque: Je n'ai aucun contrôle sur la chaîne de connexion, donc je ne peux pas activer MARS.

+0

Dans la chaîne de connexion, veillez à régler MultipleActiveResultSets = True » – pmbAustin

+0

@pmbAustin J'essaie d'éviter cela parce que je ne suis pas dans le contrôle de la chaîne de connexion. – MotKohn

Répondre

1

Ce code commence une tâche pour chaque élément dans la liste, mais n'attend pas la chaque tâche à remplir avant de commencer la suivante. Dans chaque tâche, il attend la fin de la mise à jour. Essayez

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

ce qui équivaut à

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

Si vous êtes dans une méthode non-async vous devrez attendre(), ne pas attendre chaque tâche. EG

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

Vous devez ajouter l'attribut MultipleActiveResultSets dans la chaîne de connexion et le définir sur true pour autoriser plusieurs ensembles de résultats actifs.

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

En savoir plus: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/enabling-multiple-active-result-sets

+0

J'essaie d'éviter cela parce que je suis – MotKohn

+0

Dans ce cas, vous devez utiliser une méthode non asynchrone pour mettre à jour vos entités de manière séquentielle – vendettamit

+1

Pourquoi n'attendez-vous pas d'aide? – MotKohn