Search code examples
automappericollection

how do i use AutoMapper in ICollation<> Fields


when i use AutoMapper for mapping my ViewModels and get All News, thrown error for me.

Errors... The following property on Mosque.Core.ViewModels.CategoryViewModel cannot be mapped: Categories Add a custom mapping expression, ignore, add a custom resolver, or modify the destination type Mosque.Core.ViewModels.CategoryViewModel.

please help me, thank you

//Models

public class News
{
    public int Id { get; set; }
    public string Title { get; set; }
    public virtual ICollection<Category> Categories { get; set; }
    public virtual User User { get; set; }
}

public class Category
{
    public int Id { get; set; }
    public string Title { get; set; }
    public virtual ICollection<News> News { get; set; }
}

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<News> News { get; set; }
}

//ViewModels

public class NewsViewModel
{
    public int Id { get; set; }
    public string Title { get; set; }
    public virtual ICollection<CategoryViewModel> Categories { get; set; }
    public virtual UserViewModel User { get; set; }
}

public class CategoryViewModel
{
    public int Id { get; set; }
    public string Title { get; set; }
    public virtual ICollection<NewsViewModel> News { get; set; }
}

public class UserViewModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<NewsViewModel> News { get; set; }
}

how do i use for select All News?

--Update1--

I used onion architecture in the project and i installed AutoMapper in the Service layer and i want get all news from repository and fill into ViewModels and pass to the UI. my code in service layer is...

public List<NewsViewModel> GetAll()
{
    Mapper.CreateMap<News, NewsViewModel>()
        .ForMember(dest => dest.Categories, src => src.MapFrom(p => p.Categories))
        .ForMember(dest => dest.User, src => src.MapFrom(p => p.User));
    Mapper.AssertConfigurationIsValid();
    var viewModels = new List<NewsViewModel>();
    foreach (var item in _newsRepository.GetAll())
    {
        var viewModel = Mapper.Map<News, NewsViewModel>(item);
        viewModels.Add(viewModel);
    }
    return viewModels;
}

Solution

  • You don't seem to have created maps for Catagory and User.

    Add the following maps:

    Mapper.CreateMap<User, UserViewModel>();
    Mapper.CreateMap<Category, CategoryViewModel>();
    

    By the way, why are you creating the maps inside the GetAll method? You can create the maps once, usually at application startup.