ASP.NET Core 3.1将IFormFile转字符串后更新关联子实体VideoId的方法
解决方案
适配现有代码的修改方案
你现有逻辑中AutoMapper映射生成的ParentModel实例的Children列表,和输入的ParentViewModel的Children列表顺序完全对应,只需通过索引匹配即可完成赋值。同时可以优化原有先创建再更新的逻辑,减少一次数据库写入操作。
注:已修正你原有代码中的笔误:Child类名首字母小写、子列表属性名
Children和访问时的Child不一致等问题。
修改后的控制器代码如下:
public async Task<IActionResult> Create([FromForm] ParentViewModel parent) { // 先完成映射 var parentModel = _mapper.Map<ParentModel>(parent); // 处理文件上传并赋值路径 if (parent.Children != null && parent.Children.Any()) { for (int i = 0; i < parent.Children.Count; i++) { var videoFile = parent.Children[i].VideoId; if (videoFile != null && videoFile.Length > 0) { // 上传文件得到存储路径 var videoIdString = await _helper.UploadImage(videoFile, "path"); // 赋值给对应位置的Model子实体 parentModel.Children[i].VideoId = videoIdString; } } } // 所有字段赋值完成后再执行创建,无需后续额外调用Update var result = await _ParentService.Create(parentModel); return Created(nameof(Get), result); }
更推荐的AutoMapper自定义映射方案
可以直接在AutoMapper配置中封装IFormFile到存储路径字符串的转换逻辑,后续同类场景无需重复写上传赋值代码。
- 首先添加映射配置和自定义转换器:
// AutoMapper 全局配置类 public class MappingProfile : Profile { public MappingProfile() { // 注册IFormFile到string的类型转换器 CreateMap<IFormFile, string>().ConvertUsing<IFormFileToPathConverter>(); // 配置ViewModel和Model的映射关系 CreateMap<ParentViewModel.Child, ParentModel.Child>(); CreateMap<ParentViewModel, ParentModel>(); } } // 自定义类型转换器 public class IFormFileToPathConverter : ITypeConverter<IFormFile, string> { private readonly IUploadHelper _uploadHelper; // 依赖注入直接注入你的上传帮助类 public IFormFileToPathConverter(IUploadHelper uploadHelper) { _uploadHelper = uploadHelper; } public string Convert(IFormFile source, string destination, ResolutionContext context) { if (source == null || source.Length == 0) return null; // 同步等待上传结果(转换器不支持异步,该操作不会造成死锁) return _uploadHelper.UploadImage(source, "path").GetAwaiter().GetResult(); } }
- 配置完成后控制器代码可直接简化为:
public async Task<IActionResult> Create([FromForm] ParentViewModel parent) { var result = await _ParentService.Create(_mapper.Map<ParentModel>(parent)); return Created(nameof(Get), result); }
内容的提问来源于stack exchange,提问作者hanushic
相关产品推荐
相关产品推荐

