public static void Main()
IMapper mapper = new MapperConfiguration(cfg => cfg.AddProfile<MappingProfile>())
mapper.ConfigurationProvider.AssertConfigurationIsValid();
Console.WriteLine("mapper.ConfigurationProvider.AssertConfigurationIsValid();");
Console.WriteLine("-- Create a domain model --");
var payerEmail = new Email("test@email.com", "test subject", "test body");
var adminEmail = new Email("test@email.com", "test subject", "test body", new DateTime(2020, 1, 28));
var emailTask = new EmailTask(1, new DateTime(2021, 2, 18), payerEmail, adminEmail, false, EmailTaskStatus.Unsent);
Console.WriteLine(emailTask);
Console.WriteLine("-- Mapping from domain model to dbo --");
var emailDbo = mapper.Map<EmailDbo>(emailTask);
Console.WriteLine(emailDbo);
Console.WriteLine("-- Mapping from dbo back to domain model --");
var emailTask2 = mapper.Map<EmailTask>(emailDbo);
Console.WriteLine(emailTask2);
public string SendTo { get; private set; }
public string Subject { get; private set; }
public string Body { get; private set; }
public DateTime? DateSent { get; private set; }
public Email(string sendTo, string subject, string body, DateTime? dateSent = null)
this.DateSent = dateSent;
public enum EmailTaskStatus
public int Id { get; private set; }
public DateTime DateCreated { get; private set; }
public Email PayerEmail { get; private set; }
public Email AdminEmail { get; private set; }
public bool DownloadAvailableForAdmin { get; private set; }
public EmailTaskStatus Status { get; private set; }
public EmailTask(int emailId, DateTime dateCreated, Email payerEmail, Email adminEmail, bool downloadAvailable, EmailTaskStatus status)
this.DateCreated = dateCreated;
this.PayerEmail = payerEmail;
this.AdminEmail = adminEmail;
this.DownloadAvailableForAdmin = downloadAvailable;
public override string ToString()
return JsonConvert.SerializeObject(this, Formatting.Indented);
public int EmailId { get; set; }
public DateTime DateCreated { get; set; }
public DateTime? DateSent { get; set; }
public string SendTo { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
public bool DownloadAvailable { get; set; }
public DateTime? AdminDateSent { get; set; }
public string AdminEmail { get; set; }
public string AdminSubject { get; set; }
public string AdminBody { get; set; }
public int StatusId { get; set; }
public override string ToString()
return JsonConvert.SerializeObject(this, Formatting.Indented);
public class MappingProfile : Profile
CreateMap<EmailTask, EmailDbo>()
.ForMember(dest => dest.EmailId, opts => opts.MapFrom(src => src.Id))
.ForMember(dest => dest.SendTo, opts => opts.MapFrom(src => src.PayerEmail.SendTo))
.ForMember(dest => dest.Subject, opts => opts.MapFrom(src => src.PayerEmail.Subject))
.ForMember(dest => dest.Body, opts => opts.MapFrom(src => src.PayerEmail.Body))
.ForMember(dest => dest.DateSent, opts => opts.MapFrom(src => src.PayerEmail.DateSent))
.ForMember(dest => dest.DownloadAvailable, opts => opts.MapFrom(src => src.DownloadAvailableForAdmin))
.ForMember(dest => dest.AdminEmail, opts =>
opts.PreCondition(src => (src.AdminEmail != null));
opts.MapFrom(src => src.AdminEmail.SendTo);
.ForMember(dest => dest.AdminSubject, opts =>
opts.PreCondition(src => (src.AdminEmail != null));
opts.MapFrom(src => src.AdminEmail.Subject);
.ForMember(dest => dest.AdminBody, opts =>
opts.PreCondition(src => (src.AdminEmail != null));
opts.MapFrom(src => src.AdminEmail.Body);
.ForMember(dest => dest.AdminDateSent, opts =>
opts.PreCondition(src => (src.AdminEmail != null));
opts.MapFrom(src => src.AdminEmail.DateSent);
.ForMember(dest => dest.StatusId, opts => opts.MapFrom(src => (int)src.Status));
CreateMap<EmailDbo, EmailTask>()
.ConstructUsing((s, d) => new EmailTask(s.EmailId, s.DateCreated, Helper.GetPayerEmail(s), Helper.GetAdminEmail(s), s.DownloadAvailable, (EmailTaskStatus)s.StatusId))
.IgnoreAllPropertiesWithAnInaccessibleSetter();
public static Email GetPayerEmail(EmailDbo emailDbo)
return new Email(emailDbo.SendTo, emailDbo.Subject, emailDbo.Body, emailDbo.DateSent);
public static Email GetAdminEmail(EmailDbo emailDbo)
if (string.IsNullOrWhiteSpace(emailDbo.AdminEmail) && string.IsNullOrWhiteSpace(emailDbo.AdminSubject)
&& string.IsNullOrWhiteSpace(emailDbo.AdminBody) && !emailDbo.AdminDateSent.HasValue)
return new Email(emailDbo.SendTo, emailDbo.Subject, emailDbo.Body, emailDbo.DateSent);