Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用外键从DTO映射到嵌套对象的层次结构_C#_Linq_Asp.net Core_Automapper - Fatal编程技术网

C# 如何使用外键从DTO映射到嵌套对象的层次结构

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

我希望使用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 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映射到域对象。我认为我的问题中存在混淆-我希望映射的模型是通过对外部端点请求的响应获得的。它们是我想映射到实体对象的响应对象。我已据此对问题进行了编辑