Automapper Custom Map使用“Include”来计算儿童数量

问题描述 投票:1回答:1

我有一个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获得SecGroups,例如像var grDB=_context.SecGroups.FirstOrDefault();我总是有grDB.SecGroupRights null(即使它有孩子)

我发现我必须使用“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; }
}

因此,在权利领域,我只想要孩子的数量。在我的上述场景中,将是:

grDB.SecGroupRights.Count();

我尝试做这样的映射:

        CreateMap<SecGroups, GroupsDto>(MemberList.Source)
            .ForMember(d => d.Rights, opt => opt.MapFrom(src => src.SecGroupRights.Count()));

不幸的是,问题是虽然映射SecGroupRights对象是空的,但我总是得到0计数。

所以我尝试在我的Mapping帮助器中注入_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);
c# linq asp.net-core automapper
1个回答
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);
© www.soinside.com 2019 - 2024. All rights reserved.