UseDestinationValue only when destination property is not null

后端 未结 3 1591
不知归路
不知归路 2021-01-18 08:59

How to configure AutoMapper mapping when I want to use behaviour from UseDestinationValue method, but only when destination property is NOT null.

相关标签:
3条回答
  • 2021-01-18 09:53

    Had this same problem, but with EF. Cryss' comment about using BeforeMap pointed me in the right direction.

    I ended up with code similar to:

    In the Configure() method:

    Mapper.CreateMap<ItemViewModel, Item>()
               .AfterMap((s, d) => { MapDetailsAction(s, d); })
               .ForMember(dest => dest.Details, opt => opt.UseDestinationValue());
    

    Then the Action:

    Action<ItemViewModel, Item> MapDetailsAction = (source, destination) =>
            {
                if (destination.Details == null)
                {
                    destination.Details = new Details();
                    destination.Details =
                        Mapper.Map<ItemViewModel, Item>(
                        source.Details, destination.Details);
                }
            };
    
    0 讨论(0)
  • 2021-01-18 09:54

    I had this same problem dealing with NHibernate entities and I found quite simple solution to it.

    You should initialize the Details property in the ItemViewModel constructor. This way the destination value is not null ever. Of course this does not work in more complex cases (like abstract classes).

    0 讨论(0)
  • 2021-01-18 10:01

    I think the NullSubstitute option would work for you. See: http://weblogs.asp.net/psteele/archive/2011/03/18/automapper-handling-null-members.aspx

    EDIT

    Looks like you might need to add a little conditional logic to your mapping for Details (and skip the UseDestinationValue option):

    .ForMember(d => d.Details, 
        o => o.MapFrom(s => s.Details == null ? new ItemDetails() : Mapper.Map<ItemDetailsViewModel, ItemDetails>(s.Details))
    
    0 讨论(0)
提交回复
热议问题