如何使用automapper更新嵌套的对象列表

时间:2018-01-16 11:25:59

标签: c# dns automapper

问题

我想在更新Ameneties时更新Cabins的嵌套列表,但是如果有任何Cabins进入当前控制器,它们将被简单地添加到现有列表中,每个列表都有一个新ID。

我现在能想到的唯一方法是忽略映射器中的IList,从资源到对象,并在单独的API调用中更新cabins。

这听起来像是一个额外的性能负载,所以我想知道我可能会遗漏一些东西,你可以通过ameneties控制器进行正确的自动调整功能。

有没有人遇到类似的情况?真的很感激一些帮助,谢谢。

模型

public class Amenety
{
    public int Id { get; set; }
    public IList<Cabin> Cabins { get; set; }
}

public class Cabin
{
    public int Id { get; set; }

    public string Name{ get; set; }

    public Amenety Amenety { get; set; }
    public int? AmenetyId { get; set; }
}

资源

public class AmenetyResource
{
    public int Id { get; set; }
    public IList<CabinResource> Cabins { get; set; }
}

public class CabinResource
{
    public int Id { get; set; }
    public string Name{ get; set; }
    public int AmenetyId { get; set; }
}

控制器

    [HttpPut()]
    public async Task<IActionResult> Update([FromBody] AmenetyResource dto)
    {
        var entity = await _repository.GetEntityWhere(i => i.Id == dto.Id);

        if (entity == null)
            return NotFound();

        _mapper.Map(dto, entity);

        await _unitOfWork.CompleteAsync();

        var resource = _mapper.Map<Amenety, AmenetyResource>(entity);


        return Ok(resource);
    }

映射

 //to resource
 CreateMap<Amenety, AmenetyResource>();
 CreateMap<Cabin, CabinResource>();

 //from resource
 CreateMap<CabinResource, Cabin>().ForMember(t=>t.Id, opt => opt.Ignore());
 CreateMap<AmenetyResource, Amenety>().ForMember(t => t.Id, opt => opt.Ignore());

1 个答案:

答案 0 :(得分:0)

所以,经过10分钟的睡眠和双次咖啡后,很明显我需要在控制器内部的控制中包含Cabins才能使用该列表。

var entity = await _repository.GetEntityInclude(i => i.Id == dto.Id, c => c.Cabins);

所以控制器改为这个并且它现在工作正常但是你必须确保提供一个全新的小屋列表,你现在想要在那里,因为在更新期间所有旧的小屋都将被删除。