none
EntityFramework - DbTransaction - couche business RRS feed

  • Question

  • 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 : 

    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 : 

    // .... 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 ne l'appelle pas via une autre BLL).

    J'ai donc pensé à utiliser un objet "DataContext" :

     
    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 :

     
     
    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();
        }
        // .... faire des autres calculs
    }

    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

    lundi 10 septembre 2012 08:09

Réponses

  • Bonjour,

    Utilisez la classe TransactionScope comme ceci :

    using (TransactionScope t = new TransactionScope())
    {
        // Utilisation BLL1
        // Utilisation BLL2
        t.Complete();
    }

    Cela rendre automatiquement transactionnel vos 2 accès aux 2 BLL.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    • Proposé comme réponse Aurel Bera jeudi 13 septembre 2012 15:11
    • Marqué comme réponse Aurel Bera vendredi 21 septembre 2012 13:26
    mercredi 12 septembre 2012 22:23
    Modérateur

Toutes les réponses