如果我在EF中定义了多对多的关系。
public class StudentImage
{
public int StudentId { get; set; }
public int ImageId { get; set; }
public int Order { get; set; }
public virtual Student Student { get; set; }
public virtual Image Image { get; set; }
}
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<StudentImage> Images { get; set; }
}
public class Image
{
public int Id { get; set; }
public string Filename { get; set; }
public virtual ICollection<StudentImage> Students { get; set; }
}
和DTO的关系。
public class ImageDTO
{
public int Id { get; set; }
public string Filename { get; set; }
public int Order { get; set; }
}
public class StudentIDO
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<ImageDTO> Images { get; set; }
}
我怎么能用Automapper从学生映射到学生DTO,从图像映射到图像DTO?
映射
Mapper.CreateMap<Student, StudentIDO>();
Mapper.CreateMap<StudentImage, ImageDTO>()
.ForMember(d => d.Id, opt => opt.MapFrom(s => s.ImageId))
.ForMember(d => d.Filename, opt => opt.MapFrom(s => s.Image.Filename));
Mapper.CreateMap<StudentIDO, Student>()
.AfterMap((s, d) =>
{
foreach (var studentImage in d.Images)
studentImage.StudentId = s.Id;
});
Mapper.CreateMap<ImageDTO, StudentImage>()
.ForMember(d => d.ImageId, opt => opt.MapFrom(s => s.Id));
使用方法
var studentDTO = Mapper.Map<StudentIDO>(student);
var student = Mapper.Map<Student>(studentDTO);
所以Image和ImageDTO是1:1的关系,这很容易被AutoMappper映射。
Mapper.CreateMap<Image, ImageDTO>();
Mapper.CreateMap();最后一个Student和StudentDTO,他们有包含列表。
Mapper.CreateMap<Student,StudentDTO>
.ForMember(s => s.Images, opt=>opt.MapFrom(p=>p.Images));
有时如果你尝试这样做,它的性能并不好。