2016-12-08 115 views
0

我有我想要映射到一個DTOAutomapper子映射與實體中間

上下文實體

public class CallPoint 
{ 
    public int Id { get; set; } 
    public string Name {get; set;} 
    public ICollection {UserCallPoint} UserCallPoints {get; set;} 
} 

public class UserCallPoint 
{ 
    public int Id {get; set;} 
    public CallPoint CallPoint {get; set;} 
    public User User {get; set; 
} 

public class User 
{ 
    public int Id {get; set;} 
    public string Email {get; set;} 
    public ICollection<UserCallPoint> UserCallPoints {get; set; 
} 

DTO

public class CallPointDto 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<UserDto> Users { get; set; } 
} 

public class UserDto 
{ 
    public int Id { get; set; } 
    public string Email { get; set; } 
    public List<CallPointDto> CallPoints { get; set; } 
} 

以下實體結構所以基本上我有一個多對多的映射,但有一個實體作爲查找表基本上。我如何做這個映射?我目前只是像下面循環和映射,但它太慢了

private List<CallPointDto> MapCallPoint(List<CallPoint> callPoints) 
    { 
     List<CallPointDto> callPointDtos = new List<CallPointDto>(); 
     foreach (var callPoint in callPoints) 
     { 
      var callPointDto = _mapper.Map<CallPointDto>(callPoint); 
      callPointDto.Users = new List<UserDto>(); 
      foreach (var item in callPoint.UserCallPoints) 
      { 
       UserDto userDto = _mapper.Map<UserDto>(item.User); 
       callPointDto.Users.Add(userDto); 
      } 
      callPointDtos.Add(callPointDto); 
     } 
     return callPointDtos; 
    } 

我該如何做一個自定義解析器?

+0

我看到它的權利,您的'UserDto'上的'CallPoints'沒有設置?這是打算還是應該設置?當它應該被設置時,你可能需要從DB調用所有的'CallPoint','UserCallPoint'和'User',因爲它們都可以連接。你真的在尋找一個CustomResolver或者正確的方法來映射它嗎? – Rabban

+0

基本上如果我試圖映射它與FromMember()我卡在一個循環作爲UserDto有很多與CallPointDto,所以如果我設置一個它永遠循環 –

+0

這沒有回答我的任何問題^^ – Rabban

回答

0

由於n:m關係可能會無休止地運行的問題,因此我無法給出您正在尋找的答案。但我建議你用不同的子DTO的這樣的工作:

public class CallPointBaseDto 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 
public class CallPointDto : CallPointBaseDto 
{ 
    public List<UserBaseDto> Users { get; set; } 
} 

public class UserBaseDto 
{ 
    public int Id { get; set; } 
    public string Email { get; set; } 
} 
public class UserDto : UserBaseDto 
{ 
    public List<CallPointBaseDto> CallPoints { get; set; } 
} 

映射:

cfg.CreateMap<CallPoint, CallPointDto>() 
    .ForMember(dest => dest.Users, opt => opt.MapFrom(src => src.UserCallPoints.Select(ucp => ucp.User))); 
cfg.CreateMap<User, UserBaseDto>(); 

這種方法的缺點,當然,你不必在你的UserBaseDto的CallPoints ,但如果你需要它,你可以明確地調用這個用戶並以另一種方式映射它。