Asp.net core 在AfterMap方法(AutoMaper)内异步设置视图模型的属性
在我的数据库中,我有标签表和帖子表。它们之间存在着多对多的关系。在标记实体中,我不存储使用标记的次数。此属性(Asp.net core 在AfterMap方法(AutoMaper)内异步设置视图模型的属性,asp.net-core,async-await,many-to-many,automapper,Asp.net Core,Async Await,Many To Many,Automapper,在我的数据库中,我有标签表和帖子表。它们之间存在着多对多的关系。在标记实体中,我不存储使用标记的次数。此属性(数量)位于标记视图模型内 通过使用AutoMapper我在Tag和TagViewModel之间创建了一个映射。内部AfterMap方法一设置数量属性: Mapper.Initialize(config => { config.CreateMap<Tag, TagViewModel>() .AfterMap(async (m, vm) =>
数量
)位于标记视图模型内
通过使用AutoMapper
我在Tag
和TagViewModel
之间创建了一个映射。内部AfterMap
方法一设置数量
属性:
Mapper.Initialize(config =>
{
config.CreateMap<Tag, TagViewModel>()
.AfterMap(async (m, vm) =>
{
vm.Quantity = await tagRepository.CountById(vm.Id);
});
});
如何解决此问题,或者映射后自动设置<代码>数量代码>值的更好解决方案是什么
以下是我的代码的其余部分:
实体:
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 async Task<int> CountById(int id)
{
var quantity = await context.Tags
.SelectMany(t => t.TagPost.Where(c => c.TagId == id))
.CountAsync();
return quantity;
}
public异步任务CountById(int-id)
{
var quantity=await context.Tags
.SelectMany(t=>t.TagPost.Where(c=>c.TagId==id))
.CountAsync();
退货数量;
}
您的标记类上有一个导航属性,为什么不这样做呢:
config.CreateMap<Tag, TagViewModel>()
.ForMember(d => d.Quantity, o => o.MapFrom(s => s.TagPost.Count);
config.CreateMap()
.ForMember(d=>d.Quantity,o=>o.MapFrom(s=>s.TagPost.Count);
是的,但这应该与ProjectTo一起使用。ProjectTo与MapFrom一起使用,因为MapFrom接受一个表达式,因此可以将其转换为SQL。如果我使用了ResolveUsing,它将不会是一个表达式。是的,我只是说,这应该是你答案的一部分,因为问题暗示了Map,因为它有那个后映射。我不确定我是否理解还有你。你的问题是关于一个异步AfterMap不起作用。我已经简化了你的代码使其起作用AfterMap内部执行了异步方法,这可能产生了问题-这就是标题正文的原因。在标记存储库中,标记查询现在在哪里?我包含TagPost,你的解决方案正在起作用。谢谢你的帮助。
public async Task<int> CountById(int id)
{
var quantity = await context.Tags
.SelectMany(t => t.TagPost.Where(c => c.TagId == id))
.CountAsync();
return quantity;
}
config.CreateMap<Tag, TagViewModel>()
.ForMember(d => d.Quantity, o => o.MapFrom(s => s.TagPost.Count);