在aspnetboilerplate框架子实体中添加数组数据是否可行?
你当前的错误是因为实体类和DTO的一对多关系配置错误,Recepie侧的关联属性定义为了单个Ingrident对象,无法接收数组输入,按以下步骤调整即可:
1 修正Recepie实体的关联属性
将Recepie.cs里的Ingridents属性从单个对象改为集合类型,匹配一对多的业务关系:
public class Recepie : Entity { public string RecepieName { get; set; } // 改为List集合承载多个Ingrident,同时初始化避免空引用异常 public List<Ingrident> Ingridents { get; set; } = new List<Ingrident>(); }
2 修正RecepieDto的关联属性
同步修改DTO结构,匹配实体的集合类型,支持接收数组参数:
[AutoMap(typeof(IndexIngrident.Entities.Recepie))] public class RecepieDto : EntityDto { public string RecepieName { get; set; } // 改为集合类型接收前端传入的Ingredient数组 public List<IngridentRecepieDto> Ingridents { get; set; } } public class IngridentRecepieDto : EntityDto { public string Name { get; set; } // 新增Recepie时主实体Id还未生成,改为可空类型避免参数校验错误 public int? RecepieId { get; set; } }
3 显式配置EF Core实体关系(可选,避免自动映射异常)
在项目的DbContext类OnModelCreating方法中添加显式的一对多关系配置,避免EF自动识别关系出错:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<Recepie>() .HasMany(r => r.Ingridents) .WithOne(i => i.Recepie) .HasForeignKey(i => i.RecepieId) .OnDelete(DeleteBehavior.Cascade); // 可按需调整级联删除规则 }
4 重写CreateAsync方法支持子实体批量插入
默认的AsyncCrudAppService不会自动处理子实体的持久化,需要重写创建方法手动保存关联的Ingredient:
public override async Task<RecepieDto> CreateAsync(RecepieDto input) { // 先保存主实体获取生成的Id var recepie = ObjectMapper.Map<Recepie>(input); var recepieId = await _repository.InsertAndGetIdAsync(recepie); await CurrentUnitOfWork.SaveChangesAsync(); // 批量插入关联的Ingredient实体 foreach (var ingDto in input.Ingridents) { ingDto.RecepieId = recepieId; var ingEntity = ObjectMapper.Map<Ingrident>(ingDto); await _ingRepository.InsertAsync(ingEntity); } // 返回完整的映射结果 recepie = await _repository.GetAsync(recepieId); return ObjectMapper.Map<RecepieDto>(recepie); }
调整完成后即可正常传入Ingredient数组完成批量关联添加。
内容的提问来源于stack exchange,提问作者mawerick_1
相关产品推荐
相关产品推荐

