C# 使用Automapper-如何从此ICollection映射?
我第一次使用实体框架和自动映射。我迷路了。我有一个类,其中包含我希望映射的另一个类的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
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();