2017-09-06 9 views
2

내 데이터베이스에 태그 및 게시물 테이블이 있습니다. 그들 사이에는 다 대다 관계가 있습니다. 태그 엔티티에서 태그가 사용 된 횟수를 저장하지 않습니다. 이 속성 (Quantity)은 태그보기 모델 내부에 있습니다.AfterMap 메서드 (AutoMapper) 내부에서 View Model의 속성을 비동기로 설정

AutoMapper을 사용하면 TagTagViewModel 사이의 맵을 생성합니다. 이 코드는 항상 작동하지 않습니다,

Mapper.Initialize(config => 
{ 
    config.CreateMap<Tag, TagViewModel>() 
     .AfterMap(async (m, vm) => 
     { 
      vm.Quantity = await tagRepository.CountById(vm.Id); 
     }); 
}); 

문제는 다음과 같습니다 AfterMap 방법 내부 나는 Quantity 속성을 설정합니다. 때로는 Quantity 때로는 '0'으로 설정, 적절하게 설정하고 가끔 예외가 :

BeginExecuteReader requires an open and available Connection. The connection's current state is open. 

가 어떻게이 문제를 해결할 수 있습니다 또는 자동으로 매핑 후 Quantity의 값을 설정하는 더 나은 해결책은 무엇인가?

엔티티 :

public class Tag 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<TagPost> TagPost { get; set; } = new HashSet<TagPost>(); 
} 

public class Post 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Author { get; set; } 
    public string Content { get; set; } 

    public virtual ICollection<TagPost> TagPost { get; set; } = new HashSet<TagPost>(); 
} 

public class TagThread 
{ 
    public int PostId { get; set; } 
    public Post Post { get; set; } 

    public int TagId { get; set; } 
    public Tag Tag { get; set; } 
} 

태그보기 모델 : 여기

내 코드의 나머지 부분입니다

저장소
public class TagViewModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int Quantity { get; set; } 
} 

: 당신은 탐색 속성이

public async Task<int> CountById(int id) 
{ 
    var quantity = await context.Tags 
     .SelectMany(t => t.TagPost.Where(c => c.TagId == id)) 
     .CountAsync(); 

    return quantity; 
} 

답변

3

귀하의 태그에 클래스를 사용하는 이유는 무엇입니까?

config.CreateMap<Tag, TagViewModel>() 
    .ForMember(d => d.Quantity, o => o.MapFrom(s => s.TagPost.Count); 
+0

네,하지만 ProjectTo와 함께 사용해야합니다. –

+0

ProjectTo는 MapFrom에서 작동합니다. MapFrom은 표현식 >을 허용하므로 SQL로 변환 될 수 있습니다. ResolveUsing을 사용했다면 Expression >이 아닐 것입니다. – Jack

+0

네, 그 질문은 맵을 의미하는 것처럼 당신의 대답의 일부가되어야한다는 말입니다. 애프터 맵이 있기 때문입니다. –