Automapper:映射多对多

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

我有以下模型:

public class Device
{
    public string DeviceId { get; set; }
    public string DeviceName { get; set; }

    private ICollection<TagDevice> _tagDevices;
    public virtual ICollection<TagDevice> TagDevices { get => _tagDevices ?? (_tagDevices = new List<TagDevice>()); protected set => _tagDevices = value; }

}

public class Tag : BaseEntity
{
    public string Name { get; set; }

    private ICollection<TagDevice> _tagDevices;
    public virtual ICollection<TagDevice> TagDevices { get => _tagDevices ?? (_tagDevices = new List<TagDevice>()); protected set => _tagDevices = value; }
}


public class TagDevice
{
    public int TagId { get; set; }
    public string DeviceId { get; set; }

    public virtual Tag Tag { get; set; }
    public virtual Device Device { get; set; }
}

我有DTO课程:

public class TagDisplayDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreatedAt { get; set; }
    public DateTime? UpdatedAt { get; set; }
    public int TimesUsed { get; set; }
    public int CarrierId { get; set; }
}

public class DeviceDisplayDto
{
    public string DeviceId { get; set; }
    public string DeviceName { get; set; }

    public List<TagDisplayDto> Tags { get; set; }    
}

现在,我想为DeviceDisplayDto创建映射并填充标签:

        CreateMap<Device, DeviceDisplayDto>()
            .ForMember(d => d.Tags, opt => opt.MapFrom(s => s.TagDevices...))
            ;

TagDevices是集合,而不是标记类型,集合的每个元素都具有标记类型的属性。如何创建?

entity-framework entity-framework-core many-to-many automapper
1个回答
0
投票

您可以在Select()个集合上使用TagDevice将其转换为TagDisplayDto个列表:

CreateMap<Device, DeviceDisplayDto>()
    .ForMember(deviceDisplayDto => deviceDisplayDto.Tags, options =>
        options.MapFrom(device => device.TagDevices.Select(tagDevice => new TagDisplayDto
        {
            CarrierId = 123,                // TODO
            CreatedAt = DateTime.UtcNow,    // TODO
            Id = tagDevice.TagId,
            Name = tagDevice.Tag.Name,
            TimesUsed = 0,                  // TODO
            UpdatedAt = DateTime.UtcNow,    // TODO
        }).ToList()));

我将某些属性标记为TODO,因为我不知道您使用的是整个模型,还是缺少某些属性。您需要自行填写。至少该代码应该使您入门。

© www.soinside.com 2019 - 2024. All rights reserved.