使用MVC5仓储模式展示产品及关联图片的类型转换问题求助
解决方案
报错的根本原因是你通过EF查询返回的是EDMX自动生成的tbl_product实体类对象,和你自定义的ProductDetail业务/视图模型是完全独立的两个类型,系统默认没有对应的隐式转换规则,因此直接返回会触发类型转换错误。可通过以下两种方案解决:
方案1:手动字段映射(无第三方依赖,适合小项目)
直接将查询到的tbl_product对象的字段逐行赋值给ProductDetail对象,关联的图片集合同步映射即可,代码如下:
public ProductDetail GetProductByID(int id) { var prod = storeDB.tbl_Product .Where(x => x.pro_id == id) .Include(p => p.tbl_Images) .FirstOrDefault(); // 空值判断避免空引用异常 if (prod == null) return null; // 手动映射所有字段 return new ProductDetail { pro_id = prod.pro_id, pro_name = prod.pro_name, pro_model = prod.pro_model, pro_Dimensions = prod.pro_Dimensions, pro_imageTitle = prod.pro_imageTitle, pro_image = prod.pro_image, pro_desc = prod.pro_desc, pro_price = prod.pro_price, pro_UnitsInStock = prod.pro_UnitsInStock, pro_oldprice = prod.pro_oldprice, // 映射关联的图片集合 tbl_Images = prod.tbl_Images.Select(img => new Images { ImageID = img.ImageID, productID = img.productID, ImageTitle = img.ImageTitle, ImagePath = img.ImagePath }).ToList() }; }
该方案逻辑透明,不需要引入额外组件,适合实体字段数量少的场景。
方案2:AutoMapper自动映射(适合字段多、映射场景频繁的中大型项目)
如果实体字段较多,手动映射容易出错,可以引入AutoMapper组件实现自动映射:
- 先通过NuGet安装对应ASP.NET MVC5版本的
AutoMapper包 - 在项目启动入口(如Global.asax的
Application_Start方法中)配置映射规则:
Mapper.Initialize(cfg => { // 属性名一致的字段AutoMapper会自动匹配 cfg.CreateMap<tbl_product, ProductDetail>(); // 注意区分EF生成的Images类和你自定义的Images类的命名空间,避免冲突 cfg.CreateMap<EF实体命名空间.Images, 自定义类命名空间.Images>(); });
- 修改仓储方法直接完成映射:
public ProductDetail GetProductByID(int id) { var prod = storeDB.tbl_Product .Where(x => x.pro_id == id) .Include(p => p.tbl_Images) .FirstOrDefault(); return Mapper.Map<ProductDetail>(prod); }
如果两个类的属性名不匹配,可以在CreateMap时通过ForMember方法手动指定字段对应关系。
完成映射后,控制器拿到返回的ProductDetail对象直接传给视图,就可以通过Model.tbl_Images遍历输出所有关联的产品图片了。
内容的提问来源于stack exchange,提问作者Hani
相关产品推荐
相关产品推荐

