Search code examples
c#asp.netasp.net-mvc-4automapperautomapper-3

AutoMapper.Mapper.CreateMap<TSource,TDestination>()' is obsolete


I have two classes:

class A
{
 public int id {get; set;}
}

class B
{
 public C c {get; set;}
}

class C
{
 public int id {get; set;}
 public string Name {get; set;}
}

My requirement is to map id of class A to id of class C. Now what I was doing till now was:

 Mapper.CreateMap<A, B>().ForMember(des => des.C.Id, src => src.MapFrom(x => x.id));

and it was working fine.

Now seems like AutoMapper has changed their implementation and I am getting warning as below:

AutoMapper.Mapper.CreateMap<TSource,TDestination>()' is obsolete: 'Dynamically creating maps will be removed in version 5.0. Use a MapperConfiguration instance and store statically as needed, or Mapper.Initialize. Use CreateMapper to create a mapper instance.

I need to map some properties of classes which has different name and structure. Any help on this?


Solution

  • Previously

      Mapper.CreateMap<Src, Dest>()
     .ForMember(d => d.UserName, opt => opt.MapFrom(/* ????? */));
    

    The problem here is mapping definitions are static, defined once and reused throughout the lifetime of the application. Before 3.3, you would need to re-define the mapping on every request, with the hard-coded value. And since the mapping configuration is created in a separate location than our mapping execution, we need some way to introduce a runtime parameter in our configuration, then supply it during execution.

    This is accomplished in two parts: the mapping definition where we create a runtime parameter, then at execution time when we supply it. To create the mapping definition with a runtime parameter, we “fake” a closure that includes a named local variable:

    Mapper.Initialize(cfg => {
    
    string userName = null;
    cfg.CreateMap<Source, Dest>()
        .ForMember(d => d.UserName, 
            opt => opt.MapFrom(src => userName)
        );
    });
    

    For more information see this

    For one or more classes

     cfg.CreateMissingTypeMaps = true;
     cfg.CreateMap<Source, Dest>()
        .ForMember(d => d.UserName, 
            opt => opt.MapFrom(src => userName)
        );
    
     cfg.CreateMap<AbcEditViewModel, Abc>();
     cfg.CreateMap<Abc, AbcEditViewModel>();
    });
    

    In mapping class

      IMapper mapper = config.CreateMapper();
      var source = new AbcEditViewModel();
      var dest = mapper.Map<AbcEditViewModel, Abct>(source);