【问题标题】:How to map from a DTO with a foreign key into a hierarchy of nested objects如何从具有外键的 DTO 映射到嵌套对象的层次结构
【发布时间】:2019-08-12 08:31:16
【问题描述】:

我希望在 C# .NET Core 中使用 AutoMapper 将一组 API 响应映射到一组实体对象,这些响应由外键隐式结构化,以便我可以存储在数据库中。我从 3 个单独的端点接收以下有效负载:。

public class CompanyResponse
{
    public int CompanyId { get; set; }
    public string Name { get; set; }
    public string HeadOffice { get; set; }
}

public class FactoryResponse
{
    public int FactoryId { get; set; }
    public string Address { get; set; }
    public int CompanyId { get; set; }
}

public class ProductResponse
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public int FactoryId { get; set; }
}

这是我想保存它们的嵌套结构:

public class Company
{
    public string Name { get; set; }
    public string HeadOffice { get; set; }
    public IEnumerable<Factory> Factories { get; set; }
}

public class Factory
{
    public string Address { get; set; }
    public IEnumerable<Product> Products { get; set; }
}

public class Product
{
    public string Name { get; set; }
}

Company -> Factory 和 Factory -> Product 分别是一对多的关系。

映射“Name”和“HeadOffice”等属性很容易,我已经创建了从每个 DTO 到其对应对象的 AutoMapper 映射。但是我不知道如何从 Id 中推断出子对象的列表。

这是我目前拥有的地图:

CreateMap<CompanyResponse, Company>()
    .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name))
    .ForMember(dest => dest.HeadOffice, opt => opt.MapFrom(src => src.HeadOffice));

CreateMap<FactoryResponse, Factory>()
    .ForMember(dest => dest.Address, opt => opt.MapFrom(src => src.Address));

CreateMap<ProductResponse, Product>()
    .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name));

任何帮助将不胜感激!

【问题讨论】:

  • 恐怕这是不可能的,因为 AutoMapper 在映射其中一个集合时不知道其他集合。
  • 附带说明,您不需要自动映射具有相同名称的属性(例如 Name/HeadOffice)
  • 这需要在 AutoMapper 之外完成
  • 您将无法在映射内容中执行此操作。此外,不建议从 DTO 映射到域对象 lostechies.com/jimmybogard/2009/09/18/…
  • 我相信我的问题存在混淆 - 我希望从中映射的模型是通过对外部端点请求的响应获得的。它们是我想映射到实体对象的响应对象。我已经相应地编辑了问题

标签: c# linq asp.net-core automapper


【解决方案1】:

人们提到 AutoMapper 不了解其他集合 - 因此为了解决我的问题,我必须在响应模型中创建层次结构。我通过在每个父母中添加一个 IEnumerable 属性来保存他们的孩子来做到这一点。

然后我循环遍历每个模型并添加它们对应的子模型,如下所示:

var companyResults = await companyEndpointService.GetAllAsync();
var factoryResults = await factoryEndpointService.GetAllAsync();
var productResults = await productEndpointService.GetAllAsync();

foreach (var company in companyResults)
{
    company.Factories = factoryResults
        .Where(factory => factory.CompanyId == company.CompanyId);

    foreach (var factory in company.Factories)
    {
        factory.Products = productResults
            .Where(product => product.FactoryId == factory.FactoryId);
    }
}

在建立了这个层次结构之后,我就能够执行如下简单的映射:

_mapper.Map<IEnumerable<CompanyResponse>, IEnumerable<Company>>(companyResults);

所有嵌套映射都是自动发生的,一切顺利。

【讨论】:

    猜你喜欢
    • 2017-10-17
    • 2020-01-16
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多