异步设置AfterMap方法(AutoMapper)中View Model的属性

时间:2017-09-06 12:03:39

标签: asp.net-core async-await many-to-many automapper

在我的数据库中,我有标签和帖子的表格。它们之间存在着多对多的关系。在Tag实体中,我不存储标签使用次数。此属性(Quantity)位于标记视图模型中。

使用AutoMapper我在TagTagViewModel之间创建了一个地图。在AfterMap方法内,我设置了Quantity属性:

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

问题是,这段代码并不总是有效。有时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;
}

1 个答案:

答案 0 :(得分:3)

你的Tag类有一个导航属性,为什么不这样做呢:

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