【问题标题】:Mapping properties into list of objects with automapper使用自动映射器将属性映射到对象列表中
【发布时间】:2021-08-18 09:07:57
【问题描述】:

我有一个实体 vehicle,它可以具有不同的功能(例如 GPS、自动变速箱等)。因此,我创建了这些类

public class Vehicle
{
    public Guid Id { get; set; }
    public List<Feature> Features { get; set; }
}
    
public class Feature
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    [MaxLength(10)]
    public string Code { get; set; }
    public string Description { get; set; }
}

如您所见,Feature 类中的 Code 属性是实体的主要 id。要添加车辆,我的控制器中有这样的方法

public async Task<IActionResult> AddVehicle(VehicleDto request)
{
    _logger.LogInformation($"Calling {Request.Path.Value}");

    try
    {           
        var vehicle = _mapper.Map<Vehicle>(request);

        _repository.Add(vehicle);
                
        await _repository.SaveChangesAsync();

        return StatusCode(StatusCodes.Status201Created);
    }
    catch (Exception ex)
    {
        ...
    }
}

我传递给我的 API 的对象是

public class VehicleDto
{
    public Guid Id { get; set; } = Guid.NewGuid()
    public List<string> FeatureCodes { get; set; }
}

通过这种方式,我试图仅传递 FeatureCodes 属性中的功能代码,而不是 Feature 的列表。

我的Profile 是这样的

CreateMap<VehicleDto, Vehicle>()
    .ForPath(
        dest => dest.Features.Select(f => f.Code),  // this is what I desire
        opt => opt.MapFrom(src => src.FeatureCodes)
);

但显然它不起作用。

是否可以只映射对象列表的嵌套属性?这是一种不好的做法吗?

【问题讨论】:

    标签: c# entity-framework automapper .net-5


    【解决方案1】:

    去掉字符串列表l,只需要vihacle类中的list属性即可。另外,如果你想要类之间的多对多关系,则需要在模型中包含一个实体来表示连接表,然后将导航属性添加到指向该连接表的多对多关系的任一侧而是加入实体。 https://www.learnentityframeworkcore.com/configuration/many-to-many-relationship-configuration

    【讨论】:

    • 这在 .NET 5 中不再需要。在实体中指定列表就足够了
    • 他没有说明他使用的是哪个 .net。
    猜你喜欢
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多