如何在 ASP.NET MVC 中通过自动映射器实现映射

How to implement mapping via automapper in ASP.NET MVC

我有两个class。 PRODUCT 来自 Entity Framework,Product 在 Domain 解决方案中: 以下是详细信息: 产品 class(来源):

namespace SportsStore.Domain
{
using System;
using System.Collections.Generic;

public partial class PRODUCT
{
    public int PRODUCT_ID { get; set; }
    public string PRODUCT_NAME { get; set; }
    public string PRODUCT_DESCRIPTION { get; set; }
    public decimal PRODUCT_PRICE { get; set; }
    public string PRODUCT_CATEGORY { get; set; }
}
}

产品class(目的地):

namespace SportsStore.Domain.Entities
{
public class Product
{
    [HiddenInput(DisplayValue = false)]
    public int ProductId {get;set;}
    public string ProductName {get;set;}

    [DataType(DataType.MultilineText)]
    public string ProductDescription {get;set;}
    public decimal ProductPrice {get;set;}
    public string ProductCategory { get; set; }
}

}

这是在整个项目中使用的 ProductViewModel:

   public class ProductsListViewModel
{

    public IEnumerable<Product> Products { get; set; }

    public PagingInfo _pagingInfo { get; set; }

    public PagingInfo PagingInfo { get; set; }

    public string CurrentCategory { get; set; }

}

这是我在项目中的映射,我有一个自动映射器来映射这两个。

public static class AutoMapperConfig
{
    public static void RegisterMappings()
    {

        AutoMapper.Mapper.CreateMap<PRODUCT, Product>();


        AutoMapper.Mapper.CreateMap<PRODUCT, Product>()
            .ForMember(dest => dest.ProductCategory,
                       opts => opts.MapFrom(src => src.PRODUCT_CATEGORY));

        AutoMapper.Mapper.CreateMap<PRODUCT, Product>()
            .ForMember(dest => dest.ProductDescription,
                       opts => opts.MapFrom(src => src.PRODUCT_DESCRIPTION));

        AutoMapper.Mapper.CreateMap<PRODUCT, Product>()
            .ForMember(dest => dest.ProductId,
                        opts => opts.MapFrom(src => src.PRODUCT_ID));


        AutoMapper.Mapper.CreateMap<PRODUCT, Product>()
            .ForMember(dest => dest.ProductName,
                        opts => opts.MapFrom(src => src.PRODUCT_NAME));

        AutoMapper.Mapper.CreateMap<PRODUCT, Product>()
            .ForMember(dest => dest.ProductPrice,
                        opts => opts.MapFrom(src => src.PRODUCT_PRICE));


    }
}

我在 Global.asax.cs 的 Application_Start.

中调用 RegisterMappings
   protected void Application_Start()
    {
        AutoMapperConfig.RegisterMappings();
    }

在这种情况下,我从Entity framework中读取了内容,它们的类型是PRODUCT,当我尝试将其分配给Product时,出现错误。我得到错误的点在这里:

    public ActionResult List(string category,int page = 1)
    {
        List<PRODUCT> pr = null;

        using(ProductContext pb = new ProductContext())
        {

            ProductsListViewModel model = new ProductsListViewModel
            {
                //Error is here
                Products = pb.ProductsList.Where(p => category == null || p.PRODUCT_CATEGORY == category).OrderBy(i => i.PRODUCT_ID).Skip((page - 1) * PageSize).ToList().Take(PageSize).ToList(),
                _pagingInfo = new PagingInfo
                {
                    CurrentPage = page,
                    ItemsPerPage = PageSize,
                    TotalItems = category == null ? pb.ProductsList.Count() : pb.ProductsList.Where(e => e.PRODUCT_CATEGORY == category).Count()
                },
                CurrentCategory = category
            };

            return View(model);
        }
    }

错误是这样的:

Cannot implicitly convert type 'System.Collections.Generic.List' to 'System.Collections.Generic.IEnumerable'. An explicit conversion exists (are you missing a cast?)

我该如何克服这个问题?提前致谢。

该错误说明了您需要知道的一切。在某个地方,您试图将对象列表放入相同对象的 IEnumerable。

我觉得你应该改一下这条线

Products = pb.ProductsList.Where(p => category == null || p.PRODUCT_CATEGORY == category)
.OrderBy(i => i.PRODUCT_ID)
.Skip((page - 1) * PageSize)
.ToList().Take(PageSize).ToList()

进入

Products = pb.ProductsList.Where(p => category == null || p.PRODUCT_CATEGORY == category)
.OrderBy(i => i.PRODUCT_ID)
.Skip((page - 1) * PageSize)
.Take(PageSize).AsEnumerable()