2017-07-13 6 views
5

In meiner Web-API-Controller-Methode, bevor ich die UpdatePlaceDTO zu PlaceMaster zuordnen, mache ich einen Datenbankaufruf zum Auffüllen der Eigenschaften, die nicht von der Map abgedeckt sind, aber aus irgendeinem Grund macht AutoMapper diese Eigenschaften null .AutoMapper 4.2 ignoriert Eigenschaften im Profil

Ich habe viele der Lösungen für IgnoreExistingMembers versucht, aber keiner von ihnen funktioniert.

Das ist, was ich habe

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(); 
     } 
    } 

Dies ist die Erweiterung

ist
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; 
     } 

I Module verwendet habe, die Mapper meiner depedencies zu injizieren

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(); 
     } 

ich gesehen habe in einem Thread, der _mapper.Map tatsächlich ein neues Objekt erstellt, so wie wir es machen, um "Add-on" zu der vorhandenen Eigenschaft v zu sortieren Alues?

Antwort

3

Ok, ich habe die Lösung gefunden. Es war direkt vor mir, aber ich habe es nicht gesehen!

Ich musste nur eine Überladung der Map-Funktion verwenden, die keine neue Instanz von PlaceMaster erstellt, sondern die Eigenschaften zuweist, die in der Karte verfügbar sind.

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

Gut gemacht, um die Lösung selbst zu finden! –

Verwandte Themen