Partage
  • Partager sur Facebook
  • Partager sur Twitter

Automapper - Probleme de nested mapping

    19 mars 2019 à 17:23:45

    Bonjour à tous,

    Je travaille sur un projet où j'ai :

    - une librairie DAL EntityFramework 6 Code First avec Fluent API

    - une librairie métiers.

    Je suis donc amené à convertir mes objets EF en objets de ma classe métiers.

    Mes objets sont representés par les classes TableA et TableB dans ma librairie d'accès aux données. Leur équivalent respectif dans ma librairie métier sont ClasseMétierA et ClasseMétierB.

    Mes classes EF : 

    public class TableA
      {
        
        public int id { get; set; }    
        public virtual TableB TableB { get; set; }
    }
     public class TableB
      {
        public TableB()
        {
          TableAList = new List<TableA>();
        }
        public int id { get; set; } 
        public virtual List<TableA> TableAList { get; set; }
      }

    Mes classes métiers :

    public class ClasseMetierA
      {
        private int id;
        public ClasseMetierB TableB;
    }
    public class ClassMetierB
      {
                     public ClassMetierB()
    		{
     			TableAList = new List<ClasseMetierA>();
    		}
        private int id;    
        public List<ClasseMetierA> TableAList { get; set; }
    }

    Ce que je souhaite faire :

    Je veux pouvoir passer d'un objet "TableB" à un objet "ClasseMetierB".

    Pour ca j'utilise AutoMapper au travers d'une interface : 

    // Interface de conversion entre les objets de la couche donnée (suffixe DAO) et les objets de la couche métier (suffixe BO) 
      public interface IConvertisseur<D,B>
    		where D : class 
    		where B : class
      {
        B ConvertDTB(D obj);
        D ConvertBTD(B obj);
      }

    Implémenter dans une classe :

    public class Convertisseur<D, B> : IConvertisseur<D, B> where D : class where B : class    
      {
        private MapperConfiguration mapperConfig;
        private Mapper mapper;
        
        /// <summary>
        /// Initialise la configuration du mapper pour toutes les tables BO et DAO
        /// </summary>
        public Convertisseur()
        {
          try
          {
            mapperConfig = new MapperConfiguration(cfg =>
            {
    
    					cfg.CreateMap<TableA, ClasseMetierA>().MaxDepth(3);
    					cfg.CreateMap<TableB, ClasseMetierB>().MaxDepth(3);
             
            });
            mapperConfig.AssertConfigurationIsValid();
            
          }
          catch (Exception ex)
          {
    
            throw ex;
    
          }        
    
        }
    
        public B ConvertDTB(D obj)
        {
          var mapper = mapperConfig.CreateMapper();
          return mapper.Map<B>(obj);
        }
    
        public D ConvertBTD(B obj)
        {
          var mapper = mapperConfig.CreateMapper();
          return mapper.Map<D>(obj);
        }
      }

    Je fais la conversion comme ceci :

    Convertisseur<TableB,ClasseMetierB> conv = new Convertisseur<TableB, ClasseMetierB>();
            TableB oTableB = TableBRepository.SelectAll().FirstOrDefault();      
            ClasseMetierB oClasseMetierB = conv.ConvertDTB(oTableB);

    Le problème est le suivant : 

    Dans l'objet oTableB, ma collection TableAList contient 2 élement de type TableA.

    Après conversion, dans l'objet oClasseMetierB, mon attribut ClasseMetierAList présente bien 2 élément de type ClasseMetierA, mais tous les attributs de ces deux éléments  sont null, alors que dans oTableB, l'équivalent de ces élements contient des valeurs..

    Après quelques heures de recherche, j'ai essayé avec l'option de configuration suivante : 

    mapperConfig = new MapperConfiguration(cfg =>
            {
    
    					cfg.CreateMap<TableB, ClasseMetierB>()
    						.ForMember(m => m.TableAList, opt => opt.UseDestinationValue())
    						.MaxDepth(3);
    					cfg.CreateMap<TableA, ClasseMetierA>()
    						.ForMember(m=> m.TableB, opt => opt.UseDestinationValue())
    						.MaxDepth(3);
    }

    Mais cela produit le même résultat.

    Je me suis basé sur cet exemple : http://docs.automapper.org/en/stable/Nested-mappings.html

    Merci d'avance

    -
    Edité par earp91 20 mars 2019 à 9:37:58

    • Partager sur Facebook
    • Partager sur Twitter

    Automapper - Probleme de nested mapping

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    • Editeur
    • Markdown