我确定这很简单,但我需要帮助...我正在尝试在视图中显示单个产品,并且有这个查询:
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();
,我更进了一步,并获悉SortOrder
,Categories
和InCategories
未映射。
我不愿意改变我的viewmodel(太多)。我可以使用当前的viewmodel进行映射吗?
编辑2:
显然,现在它有效。未映射的属性仍未取消映射,但当我删除Mapper.AssertConfigurationIsValid();
时,视图呈现得很好。
答案 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>();