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

Dotnet Discussion :

EntityFramework - DbTransaction - Traitement multi-BLL


Sujet :

Dotnet

  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Par défaut EntityFramework - DbTransaction - Traitement multi-BLL
    Bonjour,

    j'ai une petite question concernant le context de base de données et les transactions.

    j'ai plusieurs class BLL (ClientBLL, projetBLL, ...). Pour certains opérations, j'utilise plusieurs BLL en même temps, par exemple :
    dans clientBLL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public void Traitement1()
    {
        // .... faire des calculs
        // .... faire des choses avec la BDD
     
        projetBLL.Traitement();
     
        // ..... faire des autres choses avec BDD
    }
    ("projetBLL.Traitement()" fait également des opérations en BDD)
    Bien entendu, il peut m'arrive d'appeler directement "projetBLL.Traitement()" sans passer par ClientBLL.

    Ma question, j'aimerai une transaction autour du bloc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        // .... faire des choses avec la BDD
     
        projetBLL.Traitement()
     
        // ..... faire des autres choses avec BDD
    tout en conservant "l'autonomie" de "projetBLL.Traitement()" (qui peut lui avoir sa propre transaction seulement si je l'appelle directement).

    J'ai donc pensé à utiliser un objet "DataContext" :
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    public class DataContext : IDisposable
        {
            public static ModelContainer Context
     
            protected DbTransaction _transaction;
            public DataContext()
            {
                if (Context == null)
                {
                    Context = new KCModelContainer();
                    Context.Connection.Open();
                    _transaction = Context.Connection.BeginTransaction();
                }
            }
     
            public void Commit()
            {
                if (_transaction != null)
                {
                    _transaction.Commit();
                    _transaction.Dispose();
                    _transaction = null;
                }
            }
     
            public void Rollback()
            {
                if (_transaction != null)
                {
                    _transaction.Rollback();
                    _transaction.Dispose();
                    _transaction = null;
                }
            }
     
            public void Dispose()
            {
                if (_transaction != null)
                {
                    _transaction.Rollback();
                    if (Context.Connection.State != System.Data.ConnectionState.Closed)
                    {
                        Context.Connection.Close();
                    }
                    Context.Dispose();
                    Context = null;
                }
            }
        }
    que j'utiliserai comme ça :
    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 void Traitement1()
    {
        // ..... faire des calculs
        using(DataContext context = new DataContext())
        {
                // .... faire des choses avec la BDD
     
                projetBLL.Traitement()
     
                // ..... faire des autres choses avec BDD
     
               context.Commit();
        }
    }
    Et dans "projetBLL.Traitement()" je fais le même "using" ; comme ca, c'est l'objet BLL qui a initialisé la connexion (et donc la transaction) qui "commit" le tout.

    Qu'en pensez vous ?

    Est-ce une bonne approche ?

    Si non, comment faire pour "partager" une transaction entre objet business ?

    Merci

  2. #2
    Membre Expert Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Par défaut
    Bonsoir,

    Regardes ce super cours

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Par défaut
    Merci pour ce lien mais hélas il ne fonctionne pas, je n'arrive pas à récupérer le fichier.

    De plus je n'ai pas eu de réponse sur ma solution. Est une bonne approche ?

  4. #4
    Membre Expert Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Par défaut
    Bonjour,

    le lien est le suivant et c'est un PDF : ftp://ftp-developpez.com/merlin/cour...NetTransac.pdf et il fonctionne parfaitement ou utilises ce lien MSDN http://msdn.microsoft.com/fr-fr/libr...ionscopeoption
    Dans ce cours, tu verras que tu tentes de réinventer la roue, mais ta roue est carré...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Si non, comment faire pour "partager" une transaction entre objet business ?
    Voici la question à laquelle j'ai répondu, si j'ai décidé d'éluder la précédente c'est que je ne souhaitais pas donner mon avis, mais si tu y tiens!

    Je pense que l'idée est bonne, qu'elle existe déjà et que ce que tu as fait n'est pas safe pour les besoins d'une grosse application, mais si le contexte c'est un petit outil c'est tolérable.

    Bon dév

Discussions similaires

  1. Multi-threading barre de traitement
    Par kmtaz dans le forum Windows Forms
    Réponses: 7
    Dernier message: 15/05/2009, 08h38
  2. Réponses: 5
    Dernier message: 03/03/2009, 17h02
  3. [Form] Multi-traitements dans une JSP
    Par R1pToR dans le forum Struts 1
    Réponses: 3
    Dernier message: 20/06/2007, 17h52
  4. optimiser un traitement par du multi-threading
    Par in dans le forum Général Java
    Réponses: 10
    Dernier message: 10/10/2006, 09h46

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