如何从具有外键的 DTO 映射到嵌套对象的层次结构
How to map from a DTO with a foreign key into a hierarchy of nested objects
我希望在 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 不了解其他集合 - 因此为了解决我的问题,我必须在响应模型中创建层次结构。我通过在每个 parent 中添加一个 IEnumerable 属性 来保存它们的 children 来做到这一点。
然后我遍历每个模型并添加它们对应的 children 如下:
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);
所有嵌套映射自动发生,一切顺利。
我希望在 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 不了解其他集合 - 因此为了解决我的问题,我必须在响应模型中创建层次结构。我通过在每个 parent 中添加一个 IEnumerable 属性 来保存它们的 children 来做到这一点。
然后我遍历每个模型并添加它们对应的 children 如下:
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);
所有嵌套映射自动发生,一切顺利。