5

Background: I'm working on a webservice that I want to allow input that has a null field to mean, "don't do an update". The input object is very similar but not identical to the database model, so we're using automapper to do the transforms.

So in the case of an update, I'd like to be able to take the existing values, use them to override any of the null fields in the input, and then save that to do the whole update. So is there a way to make automapper only put values into the destination if the destination field is null?

4

3 Answers 3

2

Yes, it can, but you probably wouldn't want to go through the hassle. To do this, you're going to need to have a custom map handler for every field on the object that you want to do this (You may be able to share the custom handler among properties of the same type, but I'm not 100% sure without looking at some of my old code).

Sign up to request clarification or add additional context in comments.

3 Comments

It does look though that it is possible to do the reverse (ignore null in source). Not sure how to set the ignore condition and still use custom mapping for the parts that need it though.
OK, but how do you even do that for one field ?
@Faust - Plenty of resources on creating custom mapping logic, such as cpratt.co/using-automapper-creating-mappings
0

I recently solved this on my own problem using a PreCondition with Automapper 5.2.0.

CreateMap<Foo, Foo>()
  .ForAllMembers(opt => opt.Precondition(
    new Func<Foo, bool>( foo =>
      if (opt.DestinationMember == null) return true;
      return false;
    )
  ));

This looks at all destination members, and first looks to see if the destination member is null before even looking at the source member. (If it is not null, then it never looks at the source.)

2 Comments

DestinationMember here is the property itself, not the property value, so it's never null.
almost, just replace to opts.Condition((source, destination, sourceMember) => sourceMember != null));
0

this should help

CreateMap<Foo, Foo>()
  .ForAllMembers(opts => opts.Condition((source, destination, sourceMember) => sourceMember != null));

creds to https://stackoverflow.com/users/470005/sergey-berezovskiy, found their answer here https://stackoverflow.com/a/43947731/6049226

so related to How to ignore null values for all source members during mapping in Automapper 6?

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.