C# 使用Automapper-如何从此ICollection映射?

C# 使用Automapper-如何从此ICollection映射?,c#,asp.net-core,automapper,asp.net-core-webapi,C#,Asp.net Core,Automapper,Asp.net Core Webapi,我第一次使用实体框架和自动映射。我迷路了。我有一个类,其中包含我希望映射的另一个类的ICollection: 以下是我的课程: public class BaseEntity { public int Id { get; set; } } public class Car : BaseEntity { public string Make { get; set; } public string Model { get; set; } public int Yea

我第一次使用实体框架和自动映射。我迷路了。我有一个类,其中包含我希望映射的另一个类的ICollection:

以下是我的课程:

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

public class Car : BaseEntity {
    public string Make { get; set; }
    public string Model { get; set; }
    public int Year { get; set; }
    public ICollection<CarPart> CarParts { get; set; }
}

public class Part : BaseEntity {
    public string PartName { get; set; }
}

public class CarPart : BaseEntity {
    public int CarId { get; set; }
    public Car Car { get; set; }
    public int PartId { get; set; }
    public Part Part { get; set; }
}
要解决此问题,我需要做哪些更改? 多谢各位

编辑: StartUp.cs中包含以下内容:

public void ConfigureServices(IServiceCollection services)
{
     services.AddAutoMapper(typeof(MappingProfiles));
}
编辑2: 稍微改变一下这个范围。我把卡片换成了

public class CarDTO {
    public int CarId { get; set; }
    public string Make { get; set; }
    public string Model { get; set; }
    public int Year { get; set; }
    public IReadOnlyList<Part> Parts { get; set; }
}
并将我的映射配置文件编辑为

  public MappingProfiles () {
    
            CreateMap<Car, CarDTO> ()
.ForMember(dest => dest.CarId, opt => opt.MapFrom(src => src.Id))
                .ForMember (dest => dest.Parts, opt =>
                    opt.MapFrom (src => src.CarParts.Select (x => x.Part
                    )));
    
            CreateMap<Part, PartDTO>()
            .ForMember(dest => dest.PartId, opt => opt.MapFrom(src => src.Id))
        }
如何将此更改为:

{
    "carId": 8,
    "make": "some make",
    "model": "some model",
    "year": 2001,
    "parts": [
        {
            "partName": "Fully sick Wheels",
            "partId": 3
        },
        {
            "partName": "Mad Engine",
            "partId": 4
        }
    ]
}
加上

CreateMap<CarPart, CarPart> ();
CreateMap<Part, Part> ();
加上

CreateMap<CarPart, CarPart> ();
CreateMap<Part, Part> ();
这应该行得通

CreateMap<Car, CarDTO>().ReverseMap();
这应该行得通

CreateMap<Car, CarDTO>().ReverseMap();

将CarDTO中的collection属性更改为-

公共类卡片 { public int CarId{get;set;} 公共字符串Make{get;set;} 公共字符串模型{get;set;} 公共整数年{get;set;} 公共IReadOnlyList部分{get;set;}//此部分 } 只需将它从IReadOnlyList更改为IReadOnlyList即可解决您的问题

根据您当前对CarDTO的定义,在您的第一个映射中会显示以下配置-

.ForMember dest=>dest.Parts,opt=> opt.MapFrom src=>src.CarParts.Select x=>x.Part; 基本上是从一部分映射到另一部分


所以你的第二张地图,从一部分到另一部分,根本没有被使用。因此PartId不会显示。

将CarDTO中的collection属性更改为-

公共类卡片 { public int CarId{get;set;} 公共字符串Make{get;set;} 公共字符串模型{get;set;} 公共整数年{get;set;} 公共IReadOnlyList部分{get;set;}//此部分 } 只需将它从IReadOnlyList更改为IReadOnlyList即可解决您的问题

根据您当前对CarDTO的定义,在您的第一个映射中会显示以下配置-

.ForMember dest=>dest.Parts,opt=> opt.MapFrom src=>src.CarParts.Select x=>x.Part; 基本上是从一部分映射到另一部分


所以你的第二张地图,从一部分到另一部分,根本没有被使用。因此PartId没有显示。

您可以添加您使用的映射注册吗?提供的信息对我来说不可复制:。你有没有检查过最简单的例子是否给出了相同的异常?确保你已经注册了映射。嗨@Woody,你的automapper和asp.net core版本是什么?它可以在我的项目中很好地工作。net版本是3.1.4,austomapper是8.0.1,这一个:我尝试了建议的答案,没有任何luckCan,你可以添加你使用的映射注册吗?提供的信息对我来说不可复制:。你有没有检查过最简单的例子是否出现了同样的异常?确保你已经注册了映射。嗨@Woody,你的automapper和asp.net core版本是什么?它可以在我的项目中很好地工作。net版本是3.1.4,austomapper是8.0.1,这一个:我尝试了建议的答案,但没有任何运气
{
    "carId": 8,
    "make": "some make",
    "model": "some model",
    "year": 2001,
    "parts": [
        {
            "partName": "Fully sick Wheels",
            "id": 3
        },
        {
            "partName": "Mad Engine",
            "id": 4
        }
    ]
}
{
    "carId": 8,
    "make": "some make",
    "model": "some model",
    "year": 2001,
    "parts": [
        {
            "partName": "Fully sick Wheels",
            "partId": 3
        },
        {
            "partName": "Mad Engine",
            "partId": 4
        }
    ]
}
CreateMap<CarPart, CarPart> ();
CreateMap<Part, Part> ();
CreateMap<Car, CarDTO>().ReverseMap();