2017-07-13 30 views
5

Web API denetleyici yöntemimde, UpdatePlaceDTO'u PlaceMaster ile eşleştirmeden önce, bir Web çağrısı yapıp Harita'nın kapsanmayan özelliklerini doldurmak için bir veritabanı çağrısı yapıyorum ancak bazı nedenlerle AutoMapper bu özellikleri null yapar .AutoMapper 4.2 profildeki özellikleri göz ardı etmiyor

var mappedPlaceMaster = _mapper.Map<PlaceMaster>(placeMasterDTO); 
// mappedPlaceMaster.EntityId is null 

Birçok çözümü IgnoreExistingMembers'e denedim, ancak bunların hiçbiri çalışmıyor.

Bu

ben Gördüğüm

protected override void Load(ContainerBuilder builder) 
     { 
      //register all profile classes in the calling assembly 
      var profiles = 
       from t in typeof(Navigator.ItemManagement.Data.MappingProfiles.PlaceMapperProfile).Assembly.GetTypes() 
       where typeof(Profile).IsAssignableFrom(t) 
       select (Profile)Activator.CreateInstance(t); 

      builder.Register(context => new MapperConfiguration(cfg => 
      { 
       foreach (var profile in profiles) 
       { 
        cfg.AddProfile(profile); 
       } 


      })).AsSelf().SingleInstance(); 

      builder.Register(c => c.Resolve<MapperConfiguration>().CreateMapper(c.Resolve)) 
       .As<IMapper>() 
       .SingleInstance(); 
     } 

benim depedencies için eşleştiricisi enjekte etmek Modülleri kullandım

public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression) 
     { 
      foreach (var property in expression.TypeMap.GetUnmappedPropertyNames()) 
      { 
       expression.ForMember(property, opt => opt.Ignore()); 
      } 
      return expression; 
     } 

uzantısıdır

public class PlaceMapperProfile : Profile 
    { 

     protected override void Configure() 
     { 
      // TO DO: This Mapping doesnt work. Need to ignore other properties 
      //CreateMap<UpdatePlaceDto, PlaceMaster>() 
      // .ForMember(d => d.Name, o => o.MapFrom(s => s.Name)) 
      // .ForMember(d => d.Description, o => o.MapFrom(s => s.Description)) 
      // .ForMember(d => d.ParentPlaceId, o => o.MapFrom(s => s.ParentPlaceId)) 
      // .ForMember(d => d.LeftBower, o => o.MapFrom(s => s.LeftBower)) 
      // .ForMember(d => d.RightBower, o => o.MapFrom(s => s.RightBower)).IgnoreAllNonExisting(); 
     } 
    } 

ne var Bazı thread _mapper.Map aslında yeni bir nesne yaratır, böylece var olan varlığa "eklenti" yapmak için nasıl yaparız? edilen değerler?

cevap

3

Tamam Çözümü buldum. Önümde haklıydı ama görmedim!

Yeni bir MapMaster örneği oluşturmayan Map işlevinin aşırı yüklenmesini kullanmam gerekiyordu, ancak haritada kullanılabilen özellikleri atar.

mappedPlaceMaster = _mapper.Map(placeMasterDTO, placeMasterFromDatabase); 
+0

Çözümü bulmak için kendiniz yapın! –

İlgili konular