Automapper. Многие к одному

374
12 мая 2017, 14:07

Здравствуйте! Есть три источника данных (реляционная ДБ, EF 6, database first). Знаю, как привести к виду один к одному. Но не пойму, как положить все в одну модель (NewsModel), чтобы можно было ее одну передать во View, а не по кускам, как сейчас. Через запятую только один контекст вида db.News.ToList() судя по мануалам текущей версии automapper можно передать. Или где я ошибаюсь? Вот фрагмент кода из контроллера:

public ActionResult Index()
{
News.Domain.PortalNewsEntities db = new Domain.PortalNewsEntities();
    var NewsResult = Mapper.Map<IEnumerable<News.Domain.News>, 
          List<News.WebUI.Models.NewsModel>>(db.News.ToList());
    var CategoryResult = Mapper.Map<IEnumerable<News.Domain.Category>,
            List<News.WebUI.Models.NewsModel>>(db.Category.ToList());
var TypeResult = Mapper.Map<IEnumerable<News.Domain.Type>,
            List<News.WebUI.Models.NewsModel>>(db.Type.ToList());
    return View(NewsResult);
}

Профайл:

public class EntityToProfile: Profile
{
    public EntityToProfile()
    {          
       CreateMap<News.Domain.News, News.WebUI.Models.NewsModel>()
         .ForMember(d => d.idNews, opt => opt.MapFrom(src => src.Id))
         .ForMember(d => d.nameNews, opt => opt.MapFrom(src => src.Name))
         .ForMember(d => d.descriptionNews, opt => opt.MapFrom(src => src.Description));
        CreateMap<News.Domain.Category, News.WebUI.Models.NewsModel>()
         .ForMember(d => d.idCategory, opt => opt.MapFrom(src => src.Id))
         .ForMember(d => d.nameCategory, opt => opt.MapFrom(src => src.Name))
        // .ForMember(d => d.News, opt => opt.MapFrom(src => src.News))
        ;
        CreateMap<News.Domain.Type, News.WebUI.Models.NewsModel>()
        .ForMember(d => d.idType, opt => opt.MapFrom(src => src.Id))
        .ForMember(d => d.nameType, opt => opt.MapFrom(src => src.Name))
      //  .ForMember(d => d.Category, opt => opt.MapFrom(src => src.Category))
      ;
    }
}

Инициализация:

public static class AutoMapperConfiguration
{
    public static void Configure()
    {
        Mapper.Initialize(
            cfg =>
            {
                cfg.AddProfile<EntityToProfile>();
            }
        );
    }
}

Вот:

public partial class News
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public int CategoryId { get; set; }
    public virtual Category Category { get; set; }
}
public partial class Category
{
    public Category()
    {
        this.News = new HashSet<News>();
    }
    public int Id { get; set; }
    public string Name { get; set; }
    public int TypeId { get; set; }
    public virtual Type Type { get; set; }
    public virtual ICollection<News> News { get; set; }
}
public partial class Type
{
    public Type()
    {
        this.Category = new HashSet<Category>();
    }
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Category> Category { get; set; }
}

Это все то, что сформировалось автоматически. Вот модель, которая нужна:

public class NewsModel
{
    public int idNews { get; set; }
    public string nameNews { get; set; }
    public string descriptionNews { get; set; }       
    public int idCategory { get; set; }
    public string nameCategory { get; set; }
   //   public ICollection<News> News { get; set; }
    public int idType { get; set; }
    public string nameType { get; set; }
   //   public ICollection<Category> Category { get; set; }
}
Answer 1

Как логично заключить - маппить многие к одному нельзя.

Исходя из дискуссии в комментариях стало ясным, что требуется скрещивать таблицы базы с помощью IQueryable.Join():

var news = db.News
    .Join(db.Categories, n => n.CategoryId, c => c.Id, (n, c) => new {n, c})
    .Join(db.Types, nc => nc.c.TypeId, t => t.Id, (nc, t) => new { nc.n, nc.c, t })
    .Select(nct => new NewsModel
    {
        IdNews = nct.n.Id,
        NameNews = nct.n.Name,
        DescriptionNews = nct.n.Description,
        IdCategory = nct.c.Id,
        NameCategory = nct.c.Name,
        IdType = nct.t.Id,
        NameType = nct.t.Name
    }).ToList();

Так же тут можно было настроить маппинг с помощью Automapper, но я посчитал этот способ нецелесообразным, т.к. все равно пришлось бы явно прописывать маппинги.

READ ALSO
Оптимизация выборки из списка

Оптимизация выборки из списка

Всем доброе время суток! У меня есть список LIST, где хранятся значения координатТакже у меня есть участок, например 2000м на 2000м, который разбили...

329
Какие задачи решает структура ArraySegment&lt;T&gt;?

Какие задачи решает структура ArraySegment<T>?

Какие задачи решает структура ArraySegment?

339