2016-07-21 2 views
0

다음 클래스가 있습니다.Automapper, CustomMapping이 가상 속성의 필드를로드하지 않습니다.

public class SomeModel 
     { 
      [Key] 
      public int Id { get; set; } 
      [Required] 
      public string UserId { get; set; } 
      public virtual User User { get; set; } 
      [Required] 
      public string Name { get; set; } 
     } 

그리고 : 나는 SomeModelDetailsResponseModelIQueryableSomeModelIQueryable을 투사 할 때 몇 가지 이유를 들어

public class SomeModelDetailsResponseModel : IMapFrom<SomeModel>, IHaveCustomMappings 
    { 
     public int Id { get; set; } 
     public string UserId { get; set; } 
     public string Name { get; set; } 
     public string UserName { get; set; } 

     public void CreateMappings(IConfiguration configuration) 
     { 
      configuration.CreateMap<SomeModel, SomeModelDetailsResponseModel>("name").AfterMap((b, r) => 
      { 
       r.UserName = b.User.FirstName + b.User.LastName; 
      }); 
     } 
    } 

UserName 속성은 null 것으로 밝혀졌습니다.

+0

투영과 함께 쿼리를 표시 할 수 있습니까? –

+0

간단한 SomeQueryable.ProjectTo가 있습니다 StefanL19

+0

쿼리에 사용자가 포함되어 있습니까? 코드를 게시 할 수 있습니까? –

답변

1

가정이 당신에게 클래스 정의입니다 :

public class User 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class SomeModel 
{ 
    public int Id { get; set; } 
    public string UserId { get; set; } 
    public virtual User User { get; set; } 
    public string Name { get; set; } 
} 

public class SomeModelDetailsResponseModel 
{ 
    public int Id { get; set; } 
    public string UserId { get; set; } 
    public string Name { get; set; } 
    public string UserName { get; set; } 
} 

해결 방법 1

수행과 같은 당신의 매핑 :

var config = new MapperConfiguration(
    cfg => 
    { 
     cfg.CreateMap<SomeModel, SomeModelDetailsResponseModel>().AfterMap((b, r) => 
     { 
      r.UserName = b.User.FirstName + b.User.LastName; 
     }); 
    }); 

var mapper = config.CreateMapper(); 

var response = mapper.Map<SomeModel, SomeModelDetailsResponseModel>(new SomeModel() 
{ 
    User = new User() 
    { 
     FirstName = "FN", 
     LastName = "LN" 
    } 
}); 

당신은 IQueryable<SomeModel>로 입력을 가지고 있고 당신이 원하는 때문에 그것을 IQueryable<SomeModelDetailsResponseModel>에 투영하면 다음과 같이 할 수 있습니다 :

var result = q.Select(m => mapper.Map<SomeModel, SomeModelDetailsResponseModel>(m)); 

여기에서 qIQueryable<SomeModel> 인스턴스입니다.

솔루션은 ProjectTo<>를 사용하려면 2

, 다음과 같은 당신의 매퍼 초기화 :

Mapper.Initialize(cfg => 
{ 
    cfg.CreateMap<SomeModel, SomeModelDetailsResponseModel>() 
     .ForMember(r => r.UserName, c => c.MapFrom(o => o.User.FirstName + o.User.LastName)); 
}); 

그런 다음이로 투사를 수행

var result = q.ProjectTo<SomeModelDetailsResponseModel>().ToArray(); 

어디 qIQueryable<SomeModel>입니다.

+0

새로운 SomeModel {사용자 ...}로 아이디어를 얻지 못했기 때문에 CreateMappings 메서드에서이를 수행하는 방법에 대한 아이디어가 있습니까 – StefanL19

+0

새로운 SomeModel {사용자 ...}로 얻지 못하는 것은 무엇입니까? –

+0

IQueryable입니다.이 기회에 이것이 어떻게 유용 할 지 모르겠습니다. ProjectTo <>를 사용합니다. 나는 foreach 루프로 이것을하는 방법을 본다. 하지만 내가 사용하면 전체 매핑 구성이 쓸모 없게됩니다. – StefanL19

관련 문제