在 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 中定义的所有属性?

UserMgmtDtoUserDetailDto 的子 class,它可以有更多的属性,调试器将显示它们并且 return 结果将包括它们。这就是继承的工作原理。

userDetailsUserMgmtDto class 而非 userDetailDto 的实例。

解决方案是不要在 Dto classes 中使用继承。如果你想映射到只有几个字段的 Dto,那么映射到 that Dto.

UserDetailDto userDetails = _mapper.Map<UserDetailDto>(user);