我有一个 asp net core 2.1 项目。 数据库上下文是用 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
获取 SecGroups,例如像 var grDB=_context.SecGroups.FirstOrDefault();
我总是有 grDB.SecGroupRights
null(即使它有 child )
我发现我必须使用“Include”来获取它才能获取子项:
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; }
}
所以在 Rights 字段中,我只想要 child 的数量。在我上面的场景中是:
grDB.SecGroupRights.Count();
我试着像这样做一个映射:
CreateMap<SecGroups, GroupsDto>(MemberList.Source)
.ForMember(d => d.Rights, opt => opt.MapFrom(src => src.SecGroupRights.Count()));
不幸的是,问题是在映射 SecGroupRights 对象时为空,我总是得到 0 个计数。
所以我尝试在我的 Mapping 助手中注入(inject) _context,结果是这样的:
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);
最佳答案
映射不起作用,因为当我使用映射器时,我在源代码中没有 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);
关于c# - Automapper Custom Map 使用 "Include"来获取 child 数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52060213/