2017-09-06 68 views
2

在我的數據庫中,我有標籤和帖子表。它們之間有多對多的關係。在標籤實體中,我不存儲標籤使用次數。此屬性(Quantity)位於標記視圖模型內部。異步設置ViewMap方法(AutoMapper)中的視圖模型屬性

通過使用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; 
} 

回答

3

你有一個導航屬性在你的標籤上類,爲什麼不這樣做:

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

是的,但這應該與ProjectTo一起使用。 –

+0

ProjectTo與MapFrom一起工作,因爲MapFrom接受表達式>,所以它可以被轉換成SQL。如果我使用了ResolveUsing,它不會是表達式>。 – Jack

+0

是的,我只是說這應該是你答案的一部分,因爲這個問題暗示了Map,因爲它具有AfterMap。 –