ASP.NET 核心 MVC:AutoMapper 地图 ICollection

ASP.NET Core MVC : AutoMapper Map ICollection

我想使用 AutoMapper 将我的模型映射到我的视图模型以显示在视图中,然后再保存回数据库。

我能够成功映射模型以查看模型字段,ICollection 数据除外。我查看了一下,在填充模型时我确实得到了 ICollection

例如我的模型:

public class CarDetails 
{
    public int Id { get; set; }
    public string Make{ get; set; }
    [ForeignKey("CarId")]
    public int CarId { get; set; }
    public Car Car { get; set; }
    public int? CarFlag { get; set; }
}

public class Car
{
    public ICollection<CarDetails> CarDetails { get; set; }
    [Key]
    public int Id { get; set; }   
    public string Name{ get; set; }
} 

例如我的视图模型:

public class CarDetailsVM
{
    public string Make{ get; set; }
    public int? CarFlag { get; set; }
}

public class CarVM
{
    public ICollection<CarDetailsVM> CarDetailsVM{ get; set; }        
    public string Name{ get; set; }
}

我的地图配置文件:

   CreateMap<Car, CarVM>().ReverseMap();
   CreateMap<CarDetails, CarDetailsVM>().ReverseMap();

在我的控制器中 - 我得到的信息:

  Car model = repo.GetData(1);

  var vm = _mapper.Map<CarVM>(model);

当我查看 vm 对象时,我看到了除 CarDetailsVM 集合值之外的所有字段。我检查了模型,发现它正在从 repo.GetData(1)

中检索数据

关于如何将 ICollection 模型映射到 VM ICollection 有什么建议吗?

在提交时我会这样做:这是正确的方法吗?

[HttpPost]
public IActionResult Car(CarVM viewModel)
{
    var carObject  = repo.GetData(1);
    var mappedCar = _mapper.Map<CarVM, Car>(viewModel, carObject);
    ....//then I would pass mappedCar to repo to save to DB
}

由于两个模型的集合名称 属性 不同,您需要指定它们。例如,

CreateMap<Car, CarVM>().ForMember(dest => dest.CarDetailsVM, 
                 opt => opt.MapFrom(src => src.CarDetails))
                .ReverseMap();

这将确保在使用 Map() 方法时映射集合。

或者,当使用 RecognizePostfixes 方法在目标类型中找到匹配的 属性 时,您可以指定要从源中删除的 PostFix。

public CarProfile()
{
  RecognizePostfixes("VM");
  CreateMap<Car, CarVM>().ReverseMap();
  CreateMap<CarDetails, CarDetailsVM>().ReverseMap();
}

Automapper documentation

中阅读有关 Postfix/Prefix 配置的更多信息