在我的数据库中,我有标签和帖子的表格。它们之间存在着多对多的关系。在Tag实体中,我不存储标签使用次数。此属性(Quantity
)位于标记视图模型中。
使用AutoMapper
我在Tag
和TagViewModel
之间创建了一个地图。在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;
}
答案 0 :(得分:3)
你的Tag类有一个导航属性,为什么不这样做呢:
config.CreateMap<Tag, TagViewModel>()
.ForMember(d => d.Quantity, o => o.MapFrom(s => s.TagPost.Count);