C# 如何使用外键从DTO映射到嵌套对象的层次结构
我希望使用C#.NET内核中的AutoMapper将一组由外键隐式构造的API响应映射到一组实体对象,以便存储在DB中。我正在从3个单独的端点接收以下负载:C# 如何使用外键从DTO映射到嵌套对象的层次结构,c#,linq,asp.net-core,automapper,C#,Linq,Asp.net Core,Automapper,我希望使用C#.NET内核中的AutoMapper将一组由外键隐式构造的API响应映射到一组实体对象,以便存储在DB中。我正在从3个单独的端点接收以下负载: public class CompanyResponse { public int CompanyId { get; set; } public string Name { get; set; } public string HeadOffice { get; set; } } public class Facto
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; }
}
上市公司
{
公共字符串名称{get;set;}
公共字符串总部{get;set;}
公共IEnumerable工厂{get;set;}
}
公营工厂
{
公共字符串地址{get;set;}
公共IEnumerable乘积{get;set;}
}
公共类产品
{
公共字符串名称{get;set;}
}
公司->工厂和工厂->产品之间分别存在一对多关系
映射“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));
CreateMap()
.ForMember(dest=>dest.Name,opt=>opt.MapFrom(src=>src.Name))
.ForMember(dest=>dest.HeadOffice,opt=>opt.MapFrom(src=>src.HeadOffice));
CreateMap()
.ForMember(dest=>dest.Address,opt=>opt.MapFrom(src=>src.Address));
CreateMap()
.ForMember(dest=>dest.Name,opt=>opt.MapFrom(src=>src.Name));
任何帮助都将不胜感激 人们提到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);
在建立了这个继承权之后,我可以执行一个简单的映射,如下所示:
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);
\u mapper.Map(公司结果);
所有嵌套映射都是自动进行的,一切都很顺利。恐怕这是不可能的,因为AutoMapper在映射其中一个集合时不知道其他集合。顺便说一句,您不需要映射具有相同名称(例如名称/总部)的属性这些都需要自动映射。这需要在Automapper之外完成。您将无法在映射contenxt内部完成。此外,不建议将DTO映射到域对象。我认为我的问题中存在混淆-我希望映射的模型是通过对外部端点请求的响应获得的。它们是我想映射到实体对象的响应对象。我已据此对问题进行了编辑