2013-01-21 42 views
4

的DTO如果我有許多一對多在EF定義的關係:與許多一對多使用Automapper

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; } 
    } 

我怎麼會從學生地圖到StudentDTO和使用Automapper從圖像到ImageDTO?

回答

3

映象

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); 
+0

我將鍵類型從int更改爲Guid,現在我得到一個Automapper異常:缺少類型映射配置或不支持的映射Guid - > Int32,System.Guid - > System.Int32。目標路徑: StudentIDO.Id.Id。唯一的int字段是Order。 –

+0

@EduardoBrites這是因爲Guid無法映射到int。對於'458D34DC-5524-47F8-8507-F5AB9234063B',您期望什麼樣的整數值?改變你的DTOs ID類型爲Guid –

+0

但是當然,我愚蠢的...... –

0

所以圖片和ImageDTO是關係1:1.That的易於映射由AutoMappper

Mapper.CreateMap<Image, ImageDTO>(); 

Mapper.CreateMap(); 最後一個Student和StudentDTO,他們有包含列表。

Mapper.CreateMap<Student,StudentDTO> 
.ForMember(s => s.Images, opt=>opt.MapFrom(p=>p.Images)); 

有時候,如果您嘗試這樣做對性能不利。 謝謝