2015-04-01 67 views
1

我們的實體模型具有導航屬性:如何處理AutoMapper中的關係實體映射?

public class Course 
{ 
    public Guid Id { get; set; } 

    ... 

    public Guid InstructorId { get; set; } 
    public virtual Instructor Instructor { get; set; } 

    public virtual ICollection<Instructor> Coinstructors { get; set; } 
} 

也就是說,一門課程有一個講師和多個coinstructors。

我的視圖模型有這些教師的編號。

public class CourseCreateModel 
{ 
    ... 
    public InstructorModel Instructor { get; set; } 
    public IEnumerable<InstructorModel> Coinstructors { get; set; } 
} 

InstructorModel包含Id

public class InstructorModel 
{ 
    public Guid Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

爲了使我們的DTO CourseCreateModel數據傳輸到域模型Course,我們可以很容易地映射教練因爲在域模型InstructorId

Mapper.CreateMap<CourseCreateModel, Course>() 
    .ForMember(dest => dest.InstructorId, opts => opts.MapFrom(src => src.Instructor.Id)) 

    ...; 

但是如何映射Coinstructors?我們可以得到一個數組的構造器的id。但如何做映射?

回答

0

我相信你有兩個選擇:

選項NR。 1:

.ForMember(c=>c.Coinstructors,op=>op.MapFrom(v=>v.Coinstructorids.Select(c=>new Instructor(){Id=c}))) 

其中Coinstructorids = List<int>();

選項NR。 2:

創建一個自定義解析:

public class CustomConvert : ValueResolver<IList<int>, IList<Instructor>> 
    { 
     protected override string ResolveCore(IList<int> source) 
     { 
      string result = new List<Instructor>(); 
      foreach (var item in source) 
      { 
       result.Add(new Instructor() {Id = item}); 
      } 
      return result; 
     } 
    } 

,並使用它:

.ForMember(c => c.Coinstructors, op => op.ResolveUsing<CustomConvert>().FromMember(c => c.Coinstructorids)); 

其中Coinstructorids = List<int>();

+0

期權數量3 - 只是做手工,像我這樣做。 – 2015-04-02 21:52:00