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

C# Discussion :

2 programmes 1 seule base de données


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Points : 113
    Points
    113
    Par défaut 2 programmes 1 seule base de données
    Bonjour,

    Je travaille sur un projet qui accède à une base de données SQL server, hors cette application peut être démarrée sur plusieurs machines(différentes) en même temps.

    Le projet est sous Entity Framework.

    Mon problème est le suivant :

    Dans mon appli je charge un objet context (reflétant les données de la BDD).

    Mon objectif est de gérer mon calendrier.

    J'ai une liste d'absences qui me permet de savoir à quelle date je ne suis pas disponible.

    Lors de l'ajout d'une absence je vérifie qu'il n'y a pas déjà une absence sur le jour choisi de la manière suivante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
                List<Presence> Liste_P = (from P in Personne.Presences
                                          where
                                           (P.EnCours) &&
                                            (P.DatePresence >= DateDebut) &&
                                            (P.DatePresence <= DateFin) &&
                                            (P.DemandeConge.ID != this.ID)
                                          select P).ToList();
       if (Liste_P.Count != 0)
                {
                    Message = "Il y a déjà des absences dans cette période.";
                    return false;
                }
    Mon problème est le fait est que si la 1ère instance ajoute un congé (puis sauvegarde) alors la 2ème instance atteint son context en faisant Personne.Presences mais l'absence ajoutée par la 1ere instance n'existe pas dans la 2ème...

    Je voudrais donc savoir comment gérer ce genre de situation ?

    Merci pour l'aide que vous pourrez m'apporter.
    Cordialement

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    Tu mets le doigt sur la gestion de la concurrence...

    TU peux regarder sous Entity framework, on trouve des articles consacrer à la concurrence.

    En général, le problème est que, au moment ou tu vérifies l'existence d'un RDV, il n'y en a pas, et avant que tu es le temps de faire l'enregistrement,
    un enregistrement est fait "dans ton dos"...

    Il faut définir, d'un point vue règle métier ce que tu veux faire dans ce type de situation et ensuite, voir informatiquement comment la gérer.

    Les "options" possibles sont présentés sur ce site : Concurrence
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Points : 113
    Points
    113
    Par défaut
    Comme indiquer j'ai bien essayé d'ajouter ConcurrencyMode="Fixed" mais j'ai une erreur me disant que je ne peux pas faire ceci...

    De plus je ne sais pas trop ou gérer cette concurrence car l'accès des demandes se fait via l'objet personne est la propriété de Navigation DemandeConges


    Je modifie bien la table DemandeConges mais uniquement sur mon calendrier.

    Dois-je vérifier que la table est modifiée pour tout le monde alors qu'il ne s'agit que de mon calendrier...

    Je devrai uniquement vérifier les RDV/Absence qui me concerne non ?

    Admettons que 500 personne mettent à jour leur calendrier... je n'ai pas intérêt à vérifier que les autres personne ont ajouter un RDV dans leur calendrier sinon je ne m'en sort pas...

    Je ne trouve pas d'exemple/tuto me permettant de passer ce problème qui me turlupine depuis un bail..

    Edit :

    Mon bout de code d'ajout ressemble à ceci :
    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
     
          DemandeConges DC = new DemandeConges();
             DC.DateDebut = MDC.DateDebut;
                        DC.DateFin = MDC.DateFin;
                        DC.DateDemande = DateTime.Now;
     
                        DC.DebutMatinApresMidi = MDC.AMPMDebut;
                        DC.FinMatinApresMidi = MDC.AMPMFin;
                        DC.IDType_Presences = MDC.TP_ID;
                        DC.Personne = Pers;
                        DC.CodeStatus = 1;
     
                        string Message = "";
     
                        if (DC.DemandeCongesCorrecte(out Message)) //==> Vérif de congé déjà présente
                        {
                            Pers.DemandeConges.Add(DC);
                            List<Presence> Liste_P = DC.CreePresences(Pers);
                            DataAccess.EntitiesContext.Context.Save();
                        }
                        else
                        {
                            Session.Add("MessageErreur", Message);
                            DataAccess.EntitiesContext.Context.DeleteObject(DC);
                        }

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    Normalement, la concurrence ne se fait que sur les éléments qui sont modifiés.

    Donc, si tu modifies un rendez-vous, seul, ce rendez-vous va être concerné par la concurrence.

    Après, je laisse des pros te répondre car je ne suis pas un spécialiste de la concurrence.

    Ce que je sais, c'est que la concurrence ne s'applique uniquement que sur les enregistrements qui doivent être modifiés. Le principe est que, Entity Framework
    va te retourner une exception (ce qui est indiqué dans le lien fourni) te disant que, depuis que tu as récupéré la donnée, celle ci a été modifiée et donc, n'est
    plus égale à ce qu'il y avait au départ.. à partir de là, tu es libre de choisir une option de traitement.
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Points : 113
    Points
    113
    Par défaut
    ok, merci pour ce début de réponse.

    Mon problème est plutôt que mon nouvel enregistrement va écraser l'ancien alors que celui-ci devrait me retourner une erreur en me disant que qu'il y a déjà un rendez-vous prévu dans la période sélectionnée.

    Mon context étant celui en rame, celui-ci ne contient pas forcément les données ajoutées par l'autre instance; il est toujours possible de le rafraichir mais si l'ajout se fait juste après le rafraichissement le problème est toujours présent...

    Si quelqu'un a une petite idée de comment verrouiller ce genre de problème au niveau du client je suis preneur.

  6. #6
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    tu as toujours la possibilité de mettre un lock sur une prise de rendez-vous au niveau de la base de données et donc, empecher la création d'un rendez-vous
    si une édition est déjà en cours...

    Peut-être qu'il est plus simple de "locker" la création plutôt que de devoir gérer des créations multiples "simultanées"...
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  7. #7
    Membre régulier
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Points : 113
    Points
    113
    Par défaut
    Je n'arrive pas à trouver comment faire pour créer un lock.
    Car vu qu'il s'agit de 2 applis clientes différentes elles n'ont donc pas de variables communes.

    Je ne sais donc pas comment créer un lock de manière propre.

    Je pense qu'Entity Framework doit avoir des mécaniques de ce genre mais je ne sais pas lesquelles ni comment les mettre en œuvre.

    PS : Je suis débutant dans le domaine.

  8. #8
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  9. #9
    Membre régulier
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Points : 113
    Points
    113
    Par défaut
    ok, je vais essayer avec ceci pour commencer et je vous tiens au courant à la suite de mes essais.

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

Discussions similaires

  1. Plusieurs connexions à une seule base de données
    Par mabool dans le forum Développement Web en Java
    Réponses: 8
    Dernier message: 26/01/2010, 15h11
  2. Petit programme utilisant des bases de données
    Par arwin dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 25/03/2009, 22h59
  3. programme d'export base de donnée mysql
    Par philippe57460 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 04/07/2008, 14h09
  4. Aide pour programme lié à une base de données Access
    Par blade15 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 22/05/2008, 11h06
  5. [VB.NET] Programmer la creation base de données
    Par papy27 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 02/09/2004, 13h00

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