在 c# 中使用 automapper 时,其他属性包含在 base class 中
Additional properties gets included in base class when using automapper in c#
我正在为我的 Web API 项目使用 .NET Core 3.1。因为我有以下两个 classes:
UserDetailDto
public class UserDetailDto
{
public int UserId { get; internal set; }
[Required]
[Display(Name = "first name")]
[StringLength(50)]
public string FirstName { get; set; }
[Display(Name = "last name")]
[StringLength(50)]
public string LastName { get; set; }
[Display(Name = "email")]
[EmailAddress]
[StringLength(100)]
public string Email { get; set; }
public DateTime? DateOfBirth { get; set; }
}
UserMgmtDto
public class UserMgmtDto : UserDetailDto
{
public string MobileNo { get; set; }
public short UserType { get; set; }
public DateTime CreatedDate { get; set; }
public int ModifiedBy { get; set; }
public DateTime ModifiedDate { get; set; }
public short Status { get; set; }
}
还有一个实体class:
public class UserMgmt
{
[Key]
public int user_id { get; set; }
public string mobile_no { get; set; }
public short user_type { get; set; }
public string first_name { get; set; }
public string last_name { get; set; }
public string email { get; set; }
public DateTime date_of_birth { get; set; }
public DateTime created_date { get; set; }
public int modified_by { get; set; }
public DateTime modified_date { get; set; }
public short status { get; set; }
}
现在,在我的一个函数中,我正在从数据库中检索记录并将这些记录作为 API 中的响应。
public async Task<UserDetailDto> GetByIdAsync(int userId)
{
UserMgmt user = await _masterRepositories.UserMgmtRepository.GetByKeyAsync(userId);
UserDetailDto userDetails = _mapper.Map<UserMgmtDto>(user);
return userDetails;
}
我在配置文件 class:
中创建了如下所示的映射 cfg
CreateMap<UserMgmt, UserMgmtDto>();
CreateMap<UserMgmt, UserDetailDto>();
可以看出,记录首先存储在UserMgmt对象中,然后映射到UserDetailDto对象。我知道我没有在下面的行中做正确的映射:
UserDetailDto userDetails = _mapper.Map<UserMgmtDto>(user);
而不是这个,应该是
UserDetailDto userDetails = _mapper.Map<UserDetailDto >(user);
我现在已经更正了,但是错误映射的输出很奇怪。在 UserDetailDto 的对象中,automapper 正在返回 UserMgmtDto 的属性。
UserMgmtDto 继承了 UserDetailDto 并且与 UserDetailDto 相比具有一些额外的属性。
尽管如此,UserDetailDto 对象具有 UserMgmtDto 的所有附加属性,例如 MobileNo、UserType 等,如下图所示:
在响应中,我也获得了 UserMgmtDto 的所有属性。我只是想知道 class 对象怎么可能获得甚至没有在 class 中定义的所有属性?
UserMgmtDto
是 UserDetailDto
的子 class,它可以有更多的属性,调试器将显示它们并且 return 结果将包括它们。这就是继承的工作原理。
userDetails
是 UserMgmtDto
class 而非 userDetailDto
的实例。
解决方案是不要在 Dto classes 中使用继承。如果你想映射到只有几个字段的 Dto,那么映射到 that Dto.
UserDetailDto userDetails = _mapper.Map<UserDetailDto>(user);
我正在为我的 Web API 项目使用 .NET Core 3.1。因为我有以下两个 classes:
UserDetailDto
public class UserDetailDto
{
public int UserId { get; internal set; }
[Required]
[Display(Name = "first name")]
[StringLength(50)]
public string FirstName { get; set; }
[Display(Name = "last name")]
[StringLength(50)]
public string LastName { get; set; }
[Display(Name = "email")]
[EmailAddress]
[StringLength(100)]
public string Email { get; set; }
public DateTime? DateOfBirth { get; set; }
}
UserMgmtDto
public class UserMgmtDto : UserDetailDto
{
public string MobileNo { get; set; }
public short UserType { get; set; }
public DateTime CreatedDate { get; set; }
public int ModifiedBy { get; set; }
public DateTime ModifiedDate { get; set; }
public short Status { get; set; }
}
还有一个实体class:
public class UserMgmt
{
[Key]
public int user_id { get; set; }
public string mobile_no { get; set; }
public short user_type { get; set; }
public string first_name { get; set; }
public string last_name { get; set; }
public string email { get; set; }
public DateTime date_of_birth { get; set; }
public DateTime created_date { get; set; }
public int modified_by { get; set; }
public DateTime modified_date { get; set; }
public short status { get; set; }
}
现在,在我的一个函数中,我正在从数据库中检索记录并将这些记录作为 API 中的响应。
public async Task<UserDetailDto> GetByIdAsync(int userId)
{
UserMgmt user = await _masterRepositories.UserMgmtRepository.GetByKeyAsync(userId);
UserDetailDto userDetails = _mapper.Map<UserMgmtDto>(user);
return userDetails;
}
我在配置文件 class:
中创建了如下所示的映射 cfg CreateMap<UserMgmt, UserMgmtDto>();
CreateMap<UserMgmt, UserDetailDto>();
可以看出,记录首先存储在UserMgmt对象中,然后映射到UserDetailDto对象。我知道我没有在下面的行中做正确的映射:
UserDetailDto userDetails = _mapper.Map<UserMgmtDto>(user);
而不是这个,应该是
UserDetailDto userDetails = _mapper.Map<UserDetailDto >(user);
我现在已经更正了,但是错误映射的输出很奇怪。在 UserDetailDto 的对象中,automapper 正在返回 UserMgmtDto 的属性。 UserMgmtDto 继承了 UserDetailDto 并且与 UserDetailDto 相比具有一些额外的属性。
尽管如此,UserDetailDto 对象具有 UserMgmtDto 的所有附加属性,例如 MobileNo、UserType 等,如下图所示:
在响应中,我也获得了 UserMgmtDto 的所有属性。我只是想知道 class 对象怎么可能获得甚至没有在 class 中定义的所有属性?
UserMgmtDto
是 UserDetailDto
的子 class,它可以有更多的属性,调试器将显示它们并且 return 结果将包括它们。这就是继承的工作原理。
userDetails
是 UserMgmtDto
class 而非 userDetailDto
的实例。
解决方案是不要在 Dto classes 中使用继承。如果你想映射到只有几个字段的 Dto,那么映射到 that Dto.
UserDetailDto userDetails = _mapper.Map<UserDetailDto>(user);