Automapper - 将抽象映射到抽象
Automapper - map abstract to abstract
来源classes:
public abstract class ApplicationDriverEquipmentFormAbstractVM
{
[StringLength(256)]
public string Make { get; set; }
[StringLength(256)]
public string Model { get; set; }
[StringLength(256)]
public string Year { get; set; }
[StringLength(256)]
public string PlateNumber { get; set; }
[StringLength(256)]
public string CurrentMileage { get; set; }
}
public class ApplicationDriverEquipmentTractorFormVM : ApplicationDriverEquipmentFormAbstractVM
{
[StringLength(256)]
public string VINNumber { get; set; }
}
public class ApplicationDriverEquipmentTrailerFormVM : ApplicationDriverEquipmentFormAbstractVM
{
[StringLength(256)]
public string Length { get; set; }
}
public class ApplicationDriverEquipmentStraightTruckFormVM : ApplicationDriverEquipmentFormAbstractVM
{
[StringLength(256)]
public string VINNumber { get; set; }
[StringLength(256)]
public string Length { get; set; }
}
public class ApplicationDriverEquipmentCargoVanFormVM : ApplicationDriverEquipmentFormAbstractVM
{
[StringLength(256)]
public string VINNumber { get; set; }
[StringLength(256)]
public string Length { get; set; }
}
public class ApplicationDriverFormVM
{
public ApplicationDriverEquipmentTractorFormVM EquipmentTractor { get; set; }
public ApplicationDriverEquipmentTrailerFormVM EquipmentTrailer { get; set; }
public ApplicationDriverEquipmentStraightTruckFormVM EquipmentStraightTruck { get; set; }
public ApplicationDriverEquipmentCargoVanFormVM EquipmentCargoVan { get; set; }
}
然后我想把它映射到目的地class的设备属性,描述如下:
public class ApplicationDriverDomain
{
public List<ApplicationDriverEquipmentAbstractDomain> Equipments { get; set; }
}
public abstract class ApplicationDriverEquipmentAbstractDomain
{
public int Id { get; set; }
public string Make { get; set; }
public string Model { get; set; }
public string Year { get; set; }
public string PlateNumber { get; set; }
public string CurrentMileage { get; set; }
public string Type { get; protected set; }
}
public class ApplicationDriverEquipmentTractorDomain : ApplicationDriverEquipmentAbstractDomain
{
public ApplicationDriverEquipmentTractorDomain()
{
Type = ApplicationDriverEquipmentTypeStaticStringsDomain.Tractor;
}
public string VINNumber { get; set; }
}
public class ApplicationDriverEquipmentTrailerDomain : ApplicationDriverEquipmentAbstractDomain
{
public ApplicationDriverEquipmentTrailerDomain()
{
Type = ApplicationDriverEquipmentTypeStaticStringsDomain.Trailer;
}
public string Length { get; set; }
}
public class ApplicationDriverEquipmentStraightTruckDomain : ApplicationDriverEquipmentAbstractDomain
{
public ApplicationDriverEquipmentStraightTruckDomain()
{
Type = ApplicationDriverEquipmentTypeStaticStringsDomain.StraightTruck;
}
public string VINNumber { get; set; }
public string Length { get; set; }
}
public class ApplicationDriverEquipmentCargoVanDomain : ApplicationDriverEquipmentAbstractDomain
{
public ApplicationDriverEquipmentCargoVanDomain()
{
Type = ApplicationDriverEquipmentTypeStaticStringsDomain.CargoVan;
}
public string VINNumber { get; set; }
public string Length { get; set; }
}
我编写了以下自动映射器规则:
CreateMap<ViewModels.ApplicationDriverEquipmentFormAbstractVM, ApplicationDriverEquipmentAbstractDomain>();
CreateMap<ViewModels.ApplicationDriverEquipmentTractorFormVM, ApplicationDriverEquipmentTractorDomain>();
CreateMap<ViewModels.ApplicationDriverEquipmentTrailerFormVM, ApplicationDriverEquipmentTrailerDomain>();
CreateMap<ViewModels.ApplicationDriverEquipmentStraightTruckFormVM, ApplicationDriverEquipmentStraightTruckDomain>();
CreateMap<ViewModels.ApplicationDriverEquipmentCargoVanFormVM, ApplicationDriverEquipmentCargoVanDomain>();
CreateMap<ViewModels.ApplicationDriverFormVM, ApplicationDriverDomain>()
.ForMember(dest => dest.Equipments, opt => opt.MapFrom(src => new List<ViewModels.ApplicationDriverEquipmentFormAbstractVM>() { src.EquipmentCargoVan, src.EquipmentStraightTruck, src.EquipmentTractor, src.EquipmentTrailer }));
但它不起作用。为什么?
我找到了解决方案。需要声明映射继承:
CreateMap<ViewModels.ApplicationDriverEquipmentFormAbstractVM, ApplicationDriverEquipmentAbstractDomain>()
.Include<ViewModels.ApplicationDriverEquipmentTractorFormVM, ApplicationDriverEquipmentTractorDomain>()
.Include<ViewModels.ApplicationDriverEquipmentTrailerFormVM, ApplicationDriverEquipmentTrailerDomain>()
.Include<ViewModels.ApplicationDriverEquipmentStraightTruckFormVM, ApplicationDriverEquipmentStraightTruckDomain>()
.Include<ViewModels.ApplicationDriverEquipmentCargoVanFormVM, ApplicationDriverEquipmentCargoVanDomain>();
相关文档:
https://github.com/AutoMapper/AutoMapper/wiki/Mapping-inheritance
来源classes:
public abstract class ApplicationDriverEquipmentFormAbstractVM
{
[StringLength(256)]
public string Make { get; set; }
[StringLength(256)]
public string Model { get; set; }
[StringLength(256)]
public string Year { get; set; }
[StringLength(256)]
public string PlateNumber { get; set; }
[StringLength(256)]
public string CurrentMileage { get; set; }
}
public class ApplicationDriverEquipmentTractorFormVM : ApplicationDriverEquipmentFormAbstractVM
{
[StringLength(256)]
public string VINNumber { get; set; }
}
public class ApplicationDriverEquipmentTrailerFormVM : ApplicationDriverEquipmentFormAbstractVM
{
[StringLength(256)]
public string Length { get; set; }
}
public class ApplicationDriverEquipmentStraightTruckFormVM : ApplicationDriverEquipmentFormAbstractVM
{
[StringLength(256)]
public string VINNumber { get; set; }
[StringLength(256)]
public string Length { get; set; }
}
public class ApplicationDriverEquipmentCargoVanFormVM : ApplicationDriverEquipmentFormAbstractVM
{
[StringLength(256)]
public string VINNumber { get; set; }
[StringLength(256)]
public string Length { get; set; }
}
public class ApplicationDriverFormVM
{
public ApplicationDriverEquipmentTractorFormVM EquipmentTractor { get; set; }
public ApplicationDriverEquipmentTrailerFormVM EquipmentTrailer { get; set; }
public ApplicationDriverEquipmentStraightTruckFormVM EquipmentStraightTruck { get; set; }
public ApplicationDriverEquipmentCargoVanFormVM EquipmentCargoVan { get; set; }
}
然后我想把它映射到目的地class的设备属性,描述如下:
public class ApplicationDriverDomain
{
public List<ApplicationDriverEquipmentAbstractDomain> Equipments { get; set; }
}
public abstract class ApplicationDriverEquipmentAbstractDomain
{
public int Id { get; set; }
public string Make { get; set; }
public string Model { get; set; }
public string Year { get; set; }
public string PlateNumber { get; set; }
public string CurrentMileage { get; set; }
public string Type { get; protected set; }
}
public class ApplicationDriverEquipmentTractorDomain : ApplicationDriverEquipmentAbstractDomain
{
public ApplicationDriverEquipmentTractorDomain()
{
Type = ApplicationDriverEquipmentTypeStaticStringsDomain.Tractor;
}
public string VINNumber { get; set; }
}
public class ApplicationDriverEquipmentTrailerDomain : ApplicationDriverEquipmentAbstractDomain
{
public ApplicationDriverEquipmentTrailerDomain()
{
Type = ApplicationDriverEquipmentTypeStaticStringsDomain.Trailer;
}
public string Length { get; set; }
}
public class ApplicationDriverEquipmentStraightTruckDomain : ApplicationDriverEquipmentAbstractDomain
{
public ApplicationDriverEquipmentStraightTruckDomain()
{
Type = ApplicationDriverEquipmentTypeStaticStringsDomain.StraightTruck;
}
public string VINNumber { get; set; }
public string Length { get; set; }
}
public class ApplicationDriverEquipmentCargoVanDomain : ApplicationDriverEquipmentAbstractDomain
{
public ApplicationDriverEquipmentCargoVanDomain()
{
Type = ApplicationDriverEquipmentTypeStaticStringsDomain.CargoVan;
}
public string VINNumber { get; set; }
public string Length { get; set; }
}
我编写了以下自动映射器规则:
CreateMap<ViewModels.ApplicationDriverEquipmentFormAbstractVM, ApplicationDriverEquipmentAbstractDomain>();
CreateMap<ViewModels.ApplicationDriverEquipmentTractorFormVM, ApplicationDriverEquipmentTractorDomain>();
CreateMap<ViewModels.ApplicationDriverEquipmentTrailerFormVM, ApplicationDriverEquipmentTrailerDomain>();
CreateMap<ViewModels.ApplicationDriverEquipmentStraightTruckFormVM, ApplicationDriverEquipmentStraightTruckDomain>();
CreateMap<ViewModels.ApplicationDriverEquipmentCargoVanFormVM, ApplicationDriverEquipmentCargoVanDomain>();
CreateMap<ViewModels.ApplicationDriverFormVM, ApplicationDriverDomain>()
.ForMember(dest => dest.Equipments, opt => opt.MapFrom(src => new List<ViewModels.ApplicationDriverEquipmentFormAbstractVM>() { src.EquipmentCargoVan, src.EquipmentStraightTruck, src.EquipmentTractor, src.EquipmentTrailer }));
但它不起作用。为什么?
我找到了解决方案。需要声明映射继承:
CreateMap<ViewModels.ApplicationDriverEquipmentFormAbstractVM, ApplicationDriverEquipmentAbstractDomain>()
.Include<ViewModels.ApplicationDriverEquipmentTractorFormVM, ApplicationDriverEquipmentTractorDomain>()
.Include<ViewModels.ApplicationDriverEquipmentTrailerFormVM, ApplicationDriverEquipmentTrailerDomain>()
.Include<ViewModels.ApplicationDriverEquipmentStraightTruckFormVM, ApplicationDriverEquipmentStraightTruckDomain>()
.Include<ViewModels.ApplicationDriverEquipmentCargoVanFormVM, ApplicationDriverEquipmentCargoVanDomain>();
相关文档:
https://github.com/AutoMapper/AutoMapper/wiki/Mapping-inheritance