Здравствуйте! Есть три источника данных (реляционная ДБ, 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; }
}
Как логично заключить - маппить многие к одному нельзя.
Исходя из дискуссии в комментариях стало ясным, что требуется скрещивать таблицы базы с помощью 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, но я посчитал этот способ нецелесообразным, т.к. все равно пришлось бы явно прописывать маппинги.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Всем доброе время суток! У меня есть список LIST, где хранятся значения координатТакже у меня есть участок, например 2000м на 2000м, который разбили...