无法使用AutoMapper从模型转换为viewmodel

时间:2018-01-31 08:49:41

标签: c# asp.net-core-mvc automapper entity-framework-core

我确定这很简单,但我需要帮助...我正在尝试在视图中显示单个产品,并且有这个查询:

var Product = await (from p in _context.Products
                        where p.Id == id
                        select p).FirstOrDefaultAsync();

然后我尝试将结果映射到我的viewmodel并将其返回到视图:

var VMProduct = _mapper.Map<ViewModelProduct, Product>(Product);
return View(VMProduct);

但是,我在映射上遇到了构建错误:

  

“错误CS1503参数1:无法从'MyStore.Models.Product'转换   到MyStore.Models.ViewModels.ViewModelProduct'“

这是我的实体模型,

public class Product
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Info { get; set; }
    public decimal Price { get; set; }
    public List<ProductInCategory> InCategories { get; set; }
}

这是我的viewmodel

public class ViewModelProduct
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Info { get; set; }
    public decimal Price { get; set; }
    public int SortOrder { get; set; }
    public IEnumerable<ViewModelCategoryWithTitle> Categories { get; set; }

    public ViewModelProduct(ProductInCategory pic)
    {
        Id = pic.Product.Id;
        Title = pic.Product.Title;
        Price = pic.Product.Price;
        Info = pic.Product.Info;
        SortOrder = pic.SortOrder;
    }

    public ViewModelProduct() { }
}

这是我的地图资料:

CreateMap<Product, ViewModelProduct>();
CreateMap<ViewModelProduct, Product>();

修改

更改后

var VMProduct = _mapper.Map<ViewModelProduct, Product>(Product);

var VMProduct = _mapper.Map<Product, ViewModelProduct>(Product);

并添加了Mapper.AssertConfigurationIsValid();,我更进了一步,并获悉SortOrderCategoriesInCategories未映射。

我不愿意改变我的viewmodel(太多)。我可以使用当前的viewmodel进行映射吗?

编辑2:

显然,现在它有效。未映射的属性仍未取消映射,但当我删除Mapper.AssertConfigurationIsValid();时,视图呈现得很好。

1 个答案:

答案 0 :(得分:1)

请注意,您可以为每个成员定义应如何映射。如果目标成员的名称与源成员的名称不同,则必须执行此操作。 如果源和目标具有不同(复杂)类型,请在这些类型之间添加其他映射配置。

如果成员未映射,但设置在其他位置(例如在控制器中),请忽略它以防止在使用select (TO_CHAR(TO_NUMBER(TO_CHAR(SYSDATE,'YYDDD')))||'IW'||LPAD(TO_CHAR("SEQ_CG_IW_REF_NO"."NEXTVAL"),9,'0'))from dual; 检查配置时出错。

Mapper.AssertConfigurationIsValid()

此外,大多数情况下,只需告诉Automapper您想要的目标类型,并让它解决要应用的映射:

CreateMap<Product, ViewModelProduct>()
    // other members will be mapped by convention, because they have the same name
    .ForMember(vm => vm.SortOrder, o => o.Ignore()) // to be set in controller
    .ForMember(vm => vm.Categories, o => o.MapFrom(src => src.InCategories));

// needed to resolve InCategories -> Categories
CreateMap<ViewModelCategoryWithTitle, ProductInCategory>();