2
내 데이터베이스에 태그 및 게시물 테이블이 있습니다. 그들 사이에는 다 대다 관계가 있습니다. 태그 엔티티에서 태그가 사용 된 횟수를 저장하지 않습니다. 이 속성 (Quantity
)은 태그보기 모델 내부에 있습니다.AfterMap 메서드 (AutoMapper) 내부에서 View Model의 속성을 비동기로 설정
AutoMapper
을 사용하면 Tag
과 TagViewModel
사이의 맵을 생성합니다. 이 코드는 항상 작동하지 않습니다,
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;
}
네,하지만 ProjectTo와 함께 사용해야합니다. –
ProjectTo는 MapFrom에서 작동합니다. MapFrom은 표현식>을 허용하므로 SQL로 변환 될 수 있습니다. ResolveUsing을 사용했다면 Expression >이 아닐 것입니다. –
Jack
네, 그 질문은 맵을 의미하는 것처럼 당신의 대답의 일부가되어야한다는 말입니다. 애프터 맵이 있기 때문입니다. –