capiono
capiono

Reputation: 2997

Automapper not working in Reverse Mapping

I have these models:

public class DownloadRequest {
    public int Id { get; set; }
    public DateTime Date { get; set; } = DateTime.Now;
    public bool IsProcessed { get; set; }
    public string Output { get; set; }

    public ICollection<DownloadCategory> DownloadCategories { get; } = new HashSet<DownloadCategory>();
}

public class DownloadCategory {
    public int Id { get; set; }
    public int CategoryId { get; set; }
    public string CategoryName { get; set; }
    public virtual int RequestId { get; set; }
    public virtual DownloadRequest Request { get; set; }

    public ICollection<DownloadDocument> DownloadDocuments { get; } = new HashSet<DownloadDocument>();
}

 public class DownloadDocument {
    public int Id { get; set; }
    public int Document { get; set; }
    public string Path { get; set; }
    public virtual int CategoryId { get; set; }
    public virtual DownloadCategory Category { get; set; }
}

 public class DownloadRequestVM  {
    public int Id { get; set; }
    public DateTime Date { get; set; }
    public bool IsProcessed { get; set; }
    public string Output { get; set; }
    public ICollection<DownloadCategoryVM> DownloadCategories { get; set; } = new HashSet<DownloadCategoryVM>();

    public string Status {
        get {
            return IsProcessed ? "Processed" : "Processing";
        }
    }

    public string RealDate {
        get {
            return string.Format("{0:d/M/yyyy HH:mm:ss}", Date);
        }
    }
}

 public class DownloadCategoryVM {
    public int Id { get; set; }
    public int CategoryId { get; set; }
    public string CategoryName { get; set; }
    public int RequestId { get; set; }
    public ICollection<DownloadDocumentVM> DownloadDocuments { get; set; } = new HashSet<DownloadDocumentVM>();
}

public class DownloadDocumentVM {
    public int Document { get; set; }
    public string Path { get; set; }
}

I have configure my mapping below:

 cfg.CreateMap<DownloadDocument, DownloadDocumentVM>().ReverseMap();
            cfg.CreateMap<DownloadCategory, DownloadCategoryVM>()
                .ForMember(d => d.DownloadDocuments, opt => opt.MapFrom(s => s.DownloadDocuments))
                .ReverseMap()
                .ForMember(d => d.DownloadDocuments, opt => opt.MapFrom(s => s.DownloadDocuments))
                .ForMember(dest => dest.Request, opt => opt.Ignore());
            cfg.CreateMap<DownloadRequest, DownloadRequestVM>()
                .ForMember(d => d.DownloadCategories, opt => opt.MapFrom(s => s.DownloadCategories))
                .ReverseMap()
                .ForMember(d => d.DownloadCategories, opt => opt.MapFrom(s => s.DownloadCategories));

when I try this mapping mapper.Map<IEnumerable<DownloadRequest>, IEnumerable<DownloadRequestVM>>(entities) is works fine. but this mapper.Map<DownloadRequestVM, DownloadRequest>(request) maps only the DownloadRequest class and not DownloadDocuments collections

How do I fix my mapping configuration to work both ways?

Upvotes: 1

Views: 1156

Answers (1)

Richard
Richard

Reputation: 30628

Automapper ignores properties with no setter by default. On your VM, you have ICollection<DownloadDocumentVM> DownloadDocuments { get; set; }, but on the request you have { get; } only. Add a set:

public class DownloadRequest {
    public int Id { get; set; }
    public DateTime Date { get; set; } = DateTime.Now;
    public bool IsProcessed { get; set; }
    public string Output { get; set; }

    public ICollection<DownloadCategory> DownloadCategories { get; set; } 
        = new HashSet<DownloadCategory>();
}

Upvotes: 1

Related Questions