我有一个ASP Net Core 2.1项目。 db上下文是使用EF创建的。 这是我的SecGroups和SecGroupRights的数据库模型:
public partial class SecGroups
{
public SecGroups()
{
SecGroupRights = new HashSet<SecGroupRights>();
}
public long Id { get; set; }
public string Name { get; set; }
public bool? IsReference { get; set; }
public long? Provider { get; set; }
public long? Class { get; set; }
public SecGroups IdNavigation { get; set; }
public SecGroups InverseIdNavigation { get; set; }
public ICollection<SecGroupRights> SecGroupRights { get; set; }
}
和
public partial class SecGroupRights
{
public long Id { get; set; }
public long GroupId { get; set; }
public long RightId { get; set; }
public SecGroups Group { get; set; }
public SecRights Right { get; set; }
}
这只是SecGroups和SecGroupRights之间简单的一对多关系。
如果我通过_context
获得了SecGroup,例如像var grDB=_context.SecGroups.FirstOrDefault();
,我总是grDB.SecGroupRights
为空(即使它有孩子)
我发现我必须使用“包含”来获取它以获取孩子:
var grDB = await _context.SecGroups.Include(a => a.SecGroupRights)
.Where(a => a.Id == myID)
.FirstOrDefaultAsync();
这很好用,我可以访问SecGroupRights数据并最终获得计数。
现在,下一步是从SecGroups
到此映射创建自定义AutoMapper映射:
public class GroupsDto
{
public long? Id { get; set; }
public string Name { get; set; }
public long? Provider { get; set; }
public long? Rights { get; set; }
}
因此,在“权限”字段中,我只想要孩子的人数。在我上面的情况中,应该是:
grDB.SecGroupRights.Count();
我尝试像这样进行映射:
CreateMap<SecGroups, GroupsDto>(MemberList.Source)
.ForMember(d => d.Rights, opt => opt.MapFrom(src => src.SecGroupRights.Count()));
不幸的是,问题在于,映射SecGroupRights对象时为空,并且我总是得到0个计数。
因此,我尝试将_context注入到我的Mapping帮助器中,并最终得到以下结果:
CreateMap<SecGroups, GroupsDto>(MemberList.Source)
.ForMember(d => d.Rights, opt => opt.MapFrom(src => (
_context.SecGroupRights.Where(a => a.GroupId==src.Id).Count()
)));
但是似乎没有错误也没有计数,所以我认为映射器无法访问_context
。
有什么办法可以在我的映射器中获得此计数?我想念什么吗? 预先感谢。
--------------------------------- 编辑:
映射不起作用,因为当我使用映射器时,源中没有SecGroupRights。
所以作为参考,好的映射是:
CreateMap<SecGroups, GroupsDto>(MemberList.Source)
.ForMember(d => d.Rights, opt => opt.MapFrom(src => src.SecGroupRights.Count()));
我这样称呼:
var res= _context.SecGroups.Include(a => a.SecGroupRights).ToList();
var mapped = _mapper.Map<List<SecGroups>, List<GroupsDto>>(res);
答案 0 :(得分:0)
映射不起作用,因为当我使用映射器时,源中没有SecGroupRights。
所以作为参考,好的映射是:
CreateMap<SecGroups, GroupsDto>(MemberList.Source)
.ForMember(d => d.Rights, opt => opt.MapFrom(src => src.SecGroupRights.Count()));
我这样称呼:
var res= _context.SecGroups.Include(a => a.SecGroupRights).ToList();
var mapped = _mapper.Map<List<SecGroups>, List<GroupsDto>>(res);