Sto cercando di mappare tre modelli di entità in un modello viewmodel utilizzando AutoMapper. L'output finale dovrebbe essere un albero di categoria ricorsivo con prodotti nelle categorie. L'albero delle categorie funziona, ma i Products
-proprietà di viewmodel sono null
. La mia query restituisce categorie e prodotti, quindi penso che la mappatura non sappia come mappare i prodotti sul viewmodel.
I miei modelli di entità:
public class ProductCategory
{
public int Id { get; set; }
public int SortOrder { get; set; }
public string Title { get; set; }
[ForeignKey(nameof(ParentCategory))]
public int? ParentId { get; set; }
// Nav.props:
public ProductCategory ParentCategory { get; set; }
public ICollection<ProductCategory> Children { get; set; }
public List<ProductInCategory> ProductInCategory { get; set; }
}
public class ProductInCategory
{
public int Id { get; set; }
public int ProductId { get; set; }
public int SortOrder { get; set; }
public int ProductCategoryId { get; set; }
public bool IsProductCategoryFrontPage { get; set; }
// Nav.props.
public Product Product { get; set; }
public ProductCategory ProductCategory { get; set; }
}
public class Product
{
public int Id { get; set; }
public string Title { get; set; }
public string Info { get; set; }
public decimal Price { get; set; }
// Nav.prop:
public List<ProductInCategory> InCategories { get; set; }
}
My viewmodel:
public class ViewModelProductCategory
{
public int Id { get; set; }
public int? ParentId { get; set; }
public string Title { get; set; }
public int SortOrder { get; set; }
public string ProductCountInfo
{
get
{
return Products != null && Products.Any() ? Products.Count().ToString() : "0";
}
}
public ViewModelProductCategory ParentCategory { get; set; }
public IEnumerable<ViewModelProductCategory> Children { get; set; }
public IEnumerable<ViewModelProduct> Products { get; set; }
}
Ho provato questa mappatura (categorie di mappe, ma nessun prodotto):
CreateMap<ProductCategory, ViewModelProductCategory>();
CreateMap<ViewModelProductCategory, ProductCategory>();
Ho provato questa mappatura (categorie di mappe, ma nessun prodotto):
CreateMap<ProductCategory, ViewModelProductCategory>()
.ForMember(dto => dto.Id, opt => opt.MapFrom(src => src.Id))
.ForMember(dto => dto.ParentId, opt => opt.MapFrom(src => src.ParentId))
.ForMember(dto => dto.Title, opt => opt.MapFrom(src => src.Title))
.ForMember(dto => dto.SortOrder, opt => opt.MapFrom(src => src.SortOrder))
.ForMember(dto => dto.Children, opt => opt.MapFrom(src => src.Children))
.ForMember(dto => dto.Products, opt => opt.MapFrom(src => src.ProductInCategory));
Sembra che tu voglia saltare l'entità di giunzione (collegamento) nel modello di vista.
Per fare ciò, prima creare una mappatura da Product
a ViewModelProduct
e quindi definire una mappatura da ProductCategory.ProductInCategory
a ViewModelProductCategory.Products
utilizzando la conversione di proiezione List<ProductInCategory>
a IEnumerable<Product>
. AutoMapper si occuperà di convertire IEnumerable<Product>
in List<ViewModelProduct>
nello stesso modo in cui si eseguono query sui Products
:
CreateMap<Product, ViewModelProduct>();
CreateMap<ProductCategory, ViewModelProductCategory>()
.ForMember(dst => dst.Products, opt => opt.MapFrom(
src => src.ProductInCategory.Select(pc => pc.Product)));