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();
}
中阅读有关 Postfix/Prefix 配置的更多信息
我想使用 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();
}
中阅读有关 Postfix/Prefix 配置的更多信息