Bonjour,

Je rencontre un problème de base de données sur un projet .NET Core Razor MVC.
Le code suivant parcourt tous les éléments d'une liste d'objets, et pour chacun, l'insère en BD en asynchrone.
Avec un seul objet dans la liste, bien sûr, aucun problème.
Avec plus d'objets : seule une partie est enregistrée dans la BD, et j'obtiens toujours une erreur en cours de route.
L'erreur varie, parmi celles-ci (elles sont levées de manière un peu anarchique sur les lignes en rouge/gras dans le code ci-dessous) :

  • La connexion n'est pas fermée. L'état actuel de la connexion est en cours de connexion.
  • The context cannot be used while the model is being created. Thie exception may be thrown if the context is used inside OnModelCreating method or if the same context instance is accessed by multiple threads concurrently.
  • Un DataReader associé à cette Command est déjà ouvert. Il doit d'abord être fermé.
  • Opération non valide. La connexion est fermée.
  • Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=472540 for information on understanding and handling optimistic concurrency exceptions.


Je n'ai pas vraiment d'expérience en programmation asynchrone j'imagine que c'est la source de mes erreurs...
Pourriez-vous svp me débloquer ?
Par avance merci

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
 
        private async Task<bool> SaveAllUtilisateursAsync(IEnumerable<Models.Utilisateur> users)
        {
            var userRepository = new UserRepository();
	    var userService = new UserService();
            var taskList = users.Select(user => Task.Run(async () =>
            {
                await SaveOneUtilisateursAsync(userRepository, userService, user);
            }));
            await Task.WhenAll(taskList);
            return userRepository.Save();
        }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
 
        private async Task<bool> SaveOneUtilisateurAsync(UserRepository userRepository, UserService userService, Models.Utilisateur utilisateur)
        {
            var rechercheUtilisateur = userService.GetByIdImport(utilisateur.IdImport);
            if (rechercheUtilisateur.Count() == 0)
                userRepository.Insert(utilisateur);
            else
                userRepository.Update(utilisateur);
            return true;
        }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
    public class UserService
    {
        private UserRepository dal;
 
        public UserService()
        {
            dal = new UserRepository();
        }
 
 
        public IQueryable<User> GetByIdImport(int id)
        {
            return dal.Query<User>().Where(b => b.IdUser == id);
        }
    }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    public class UserRepository : IRepository
    {
        public  DbContext dataContext;

        public UserRepository ()
        {
            dataContext = new Models.UeerContext();
          }

        public UserRepository (DbContext DataContext)
        {
            dataContext = DataContext;
        }

        public T Get<T>(int id) where T : class
            => dataContext.Set<T>().Find(id);

        public T SingleOrDefault<T>(System.Linq.Expressions.Expression<Func<T, bool>> predicate) where T : class
            => dataContext.Set<T>().SingleOrDefault(predicate);

        public void Insert<T>(T entity) where T : class
        {
            dataContext.Set<T>().Add(entity);
            dataContext.SaveChanges();
        }

        public void Update<T>(T entity) where T : class
        {
            DbEntityEntry entityEntry = dataContext.Entry(entity);
            if (entityEntry.State == System.Data.Entity.EntityState.Detached)
            {
                dataContext.Set<T>().Attach(entity);
                entityEntry.State = System.Data.Entity.EntityState.Modified;
            }
        }
    }