0

Project (destination) has both public ctor with paramters and protected parameterless ctor.

public Project(String name, User initiator) {
    this.Name = name;
    this.Initiator = initiator;
    this.InitializedOn = DateTime.Now;
}

// meant only to support some EF-related operations
protected Project() {}

The map:

Mapper.CreateMap<CreateProjectModel, Project>().ForMember(
    dest => dest.Name,
    opt => opt.MapFrom(src => src.ProjectName)
);

Consider the excerpt from create action:

var user = dbContext.Users.Find(someId);
// initialize model using protected ctor - that's the behavior by default
var model = Mapper.Map<Project>(project);    
// then initialize some additional properties

// or initialize model as it needs to be
// var model = new Project(project.ProjectName, user); 
// and populate everything by hand

Is it possible to use new Project(project.ProjectName, user) initialization and to map the rest source properties using Automapper?

lexeme
  • 2,915
  • 10
  • 60
  • 125
  • 1
    See this: http://stackoverflow.com/questions/2239143/automapper-how-to-map-to-constructor-parameters-instead-of-property-setters – Fung May 21 '14 at 08:14
  • @Fung I've already seen this thread. And it differs from what I'm asking. parameter `i` of `ConstructUsing(i =>` doesn't contain properties of Project model. – lexeme May 21 '14 at 09:01
  • Source and destination are of different types. – lexeme May 21 '14 at 09:42

1 Answers1

1

Since the other constructor is based on multiple source types, you may have to invoke it explicitly and map ther remaining properties through AutoMapper:

CreateProjectModel project = ...

var model = new Project(project.ProjectName, user);
Mapper.Map(project, model);
Fung
  • 3,508
  • 2
  • 26
  • 33