IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET MVC Discussion :

Accès concurrent DBContext


Sujet :

ASP.NET MVC

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Août 2004
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 282
    Par défaut Accès concurrent DBContext
    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;
                }
            }
        }

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Août 2004
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 282
    Par défaut
    Avec ce correctif j'ai évité de créer un UserRepository pour chaque enregistrement traité, ça m'a résolu pas mal de problèmes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        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(new UserRepository(), userService, user);
                }));
                await Task.WhenAll(taskList);
                return userRepository.Save();
            }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. accés concurrent à une table
    Par shout dans le forum Oracle
    Réponses: 5
    Dernier message: 06/10/2005, 10h54
  2. Réponses: 22
    Dernier message: 25/08/2005, 16h03
  3. Lenteur et acces concurrent
    Par JeanMarc_T2k dans le forum Bases de données
    Réponses: 7
    Dernier message: 04/12/2004, 20h57
  4. acces concurrent avec delphi 5 entreprise
    Par Jean_paul dans le forum Bases de données
    Réponses: 2
    Dernier message: 30/11/2004, 20h19
  5. [EJB] Accès concurrents à la base de données
    Par cameleon2002 dans le forum Java EE
    Réponses: 10
    Dernier message: 23/09/2003, 11h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo