具有嵌套对象和容器的 AutoMapper class
AutoMapper with nested objects and container class
我正在使用 .NET 核心开发 API 并使用 AutoMapper。
所有 API 响应都将在 JSON 响应中用数据元素包装,如下例
获取用户
{
"data" {
"id" : 1,
"user_name": "abc"
"countryr" : {
"id" : 1348,
"code" : "USA"
}
}
}
所以我们有一个 User
和 Country
的实体
public partial class User
{
public int Id { get; set; }
public string FirstName { get; set; }
public virtual Country country { get; set; }
}
public partial class Country
{
public int Id { get; set; }
public string Code{ get; set; }
}
为了将实体映射到 DTO,我们有下面的 reponseDTO
public class GetUserDTO {
public User data {get; set;} // To wrap reponse with data
}
public class UserDto {
public int id {get; set;}
public String user_name {get; set;}
public Country country {get; set;}
}
public class CountryDto {
public int id {get; set;}
public String code {get; set;}
}
根据我的理解,我应该将实体 User 映射到 UserDTO
并将 Country 实体映射到 CountryDTO
但是 GetUserDTO
class 本身呢?它基本上包含其他实体,因此 class 本身不能映射到它充当容器的任何东西。
下面我所做的是不正确的
public class UserProfile : AutoMapper.Profile
{
public MappingProfile()
{
CreateMap<User, GetUserDTO>();
CreateMap<User, UserDto>()
.ForMember(userDto => userDto.user_name, map => map.MapFrom(user => user.FirstName))
CreateMap<Country, CountryDto>();
}
}
Json 回应
{
"data" : null
}
遇到这种情况怎么办?
您不应在 DTO classes 中引用您的实体 classes。您可能想要如下更改 DTO。
public class GetUserDTO {
public UserDto data {get; set;} // To wrap reponse with data
}
public class UserDto {
public int id {get; set;}
public string user_name {get; set;}
public CountryDto country {get; set;}
}
public class CountryDto {
public int id {get; set;}
public string code {get; set;}
}
然后在 Mapper 配置文件中,您需要显式映射每个 属性,因为情况不同(如果名称完全相同,AutoMapper 将在不显式映射的情况下进行映射。在您的示例中,有一个案例差异)
然后从 MapperProfile 中删除以下行,因为没有从 User class 到 GetUserDTO class 的映射。这就是您没有得到任何输出的原因。
CreateMap<User, GetUserDTO>();
在获取数据时,您应该创建一个新的 GetUserDTO 实例 class 并根据用户对象的映射结果设置 属性“数据”。
这将为您提供输出。
我正在使用 .NET 核心开发 API 并使用 AutoMapper。
所有 API 响应都将在 JSON 响应中用数据元素包装,如下例
获取用户
{
"data" {
"id" : 1,
"user_name": "abc"
"countryr" : {
"id" : 1348,
"code" : "USA"
}
}
}
所以我们有一个 User
和 Country
public partial class User
{
public int Id { get; set; }
public string FirstName { get; set; }
public virtual Country country { get; set; }
}
public partial class Country
{
public int Id { get; set; }
public string Code{ get; set; }
}
为了将实体映射到 DTO,我们有下面的 reponseDTO
public class GetUserDTO {
public User data {get; set;} // To wrap reponse with data
}
public class UserDto {
public int id {get; set;}
public String user_name {get; set;}
public Country country {get; set;}
}
public class CountryDto {
public int id {get; set;}
public String code {get; set;}
}
根据我的理解,我应该将实体 User 映射到 UserDTO
并将 Country 实体映射到 CountryDTO
但是 GetUserDTO
class 本身呢?它基本上包含其他实体,因此 class 本身不能映射到它充当容器的任何东西。
下面我所做的是不正确的
public class UserProfile : AutoMapper.Profile
{
public MappingProfile()
{
CreateMap<User, GetUserDTO>();
CreateMap<User, UserDto>()
.ForMember(userDto => userDto.user_name, map => map.MapFrom(user => user.FirstName))
CreateMap<Country, CountryDto>();
}
}
Json 回应
{
"data" : null
}
遇到这种情况怎么办?
您不应在 DTO classes 中引用您的实体 classes。您可能想要如下更改 DTO。
public class GetUserDTO {
public UserDto data {get; set;} // To wrap reponse with data
}
public class UserDto {
public int id {get; set;}
public string user_name {get; set;}
public CountryDto country {get; set;}
}
public class CountryDto {
public int id {get; set;}
public string code {get; set;}
}
然后在 Mapper 配置文件中,您需要显式映射每个 属性,因为情况不同(如果名称完全相同,AutoMapper 将在不显式映射的情况下进行映射。在您的示例中,有一个案例差异)
然后从 MapperProfile 中删除以下行,因为没有从 User class 到 GetUserDTO class 的映射。这就是您没有得到任何输出的原因。
CreateMap<User, GetUserDTO>();
在获取数据时,您应该创建一个新的 GetUserDTO 实例 class 并根据用户对象的映射结果设置 属性“数据”。
这将为您提供输出。