【问题标题】:ASP.NET Core Web API with Entity Framework : return object with relationship带有实体框架的 ASP.NET Core Web API:返回具有关系的对象
【发布时间】:2021-11-11 04:59:57
【问题描述】:

我很抱歉我的英语不好。

我有一个使用实体框架的 ASP.NET Core Web API。对于我的一种方法,我想返回一个具有所有关系(一对一)的对象。

我的UserAccount 班级是:

[Table("UserAccount")]
public class UserAccount : BaseClass
{
    // Foreign Keys
    [ForeignKey(nameof(UserAccountType))]
    public int UserAccountTypeId { get; set; } 
    [ForeignKey(nameof(Gender))]
    public int GenderId { get; set; }
    [ForeignKey(nameof(Truck))]
    public int? TruckId { get; set; }

    // Properties
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public string UserName { get; set; }
    [DataType(DataType.EmailAddress)]
    public string Mail { get; set; }
    public string Login { get; set; }
    [DataType(DataType.Password)]
    public string Password { get; set; }

    // Navigation Properties
    [IgnoreDataMember]
    public virtual Gender Gender { get; set; }
    [IgnoreDataMember]
    public virtual UserAccountType UserAccountType { get; set; }
    [IgnoreDataMember]
    public virtual Truck Truck { get; set; }
}

我也使用 DTO 类:

public class UserAccountDto : BaseClassDto
{
    // Foreign Keys
    public int UserAccountTypeId { get; set; }
    public int GenderId { get; set; }
    public int TruckId { get; set; }

    // Properties
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public string UserName { get; set; }
    public string Mail { get; set; }
    public string Login { get; set; }
    public string Password { get; set; }

    // Linked Objects
    public virtual GenderDto Gender { get; set; }
    public virtual UserAccountTypeDto UserAccountTypes { get; set; }
    public virtual TruckDto Trucks { get; set; }
}

我想接收GenderUserAccountTypeTruck 的所有关系对象。

我的方法是:

[HttpGet("GetByTruck/{truckId}", Name = "UserAccountByTruckId")]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task<ActionResult<UserAccount>> GetByTruckId(int truckId)
{
    if (truckId <= 0) 
        return BadRequest();

    try
    {
        var userAccounts = await _repository.UserAccount.GetByTruckIdAsync(truckId);
        var userAccountsResult = _mapper.Map<IEnumerable<UserAccountDto>>(userAccounts);

        if (userAccountsResult == null) 
            return NotFound();

        return Ok(userAccountsResult);
    }
    catch (Exception ex)
    {
        _logger.LogError($"Something went wrong inside GetById action int UserAccountController : {ex.Message} ");
        return StatusCode(StatusCodes.Status500InternalServerError, "Internal Server Error");
    }
}

在此方法中,属性包含所有对象,但是当我尝试使用 Dto 类映射结果时,我丢失了关系对象。

所以我只有一个 UserAccount 对象,没有其他对象,如 Gender、UserAccountType 或 Truck。 此对象变为 Null。 有没有人可以帮帮我?

谢谢

【问题讨论】:

  • 您好,首先,我强烈建议您使用外观或至少使用存储库从控制器操作中提取用于操作数据库的代码。对于您的问题,我看到您正在使用某种映射器(也许是自动映射器?)。您将实体映射到 DTO 的映射配置文件定义是什么?
  • 尝试创建映射配置: Mapper.CreateMap() .ForMember(dto => dto.Gender, opt => opt.MapFrom(x => x.Gender));
  • @SamJ26 我实际上使用了一个包含 Gender、UserAccountType 和 Truck 的存储库。我也有这个CreateMap&lt;UserAccount, UserAccountDto&gt;(); 的映射器文件
  • @ranton187 我有一个带有这个CreateMap&lt;UserAccount, UserAccountDto&gt;(); 的映射文件。你能如何(以及在​​哪里)使用 .ForMember(dto => dto.Gender...) 吗?谢谢
  • @ranton187 好的...我试试这个` CreateMap().ForMember(dto => dto.Genders, opt => opt.MapFrom(x => x.Gender) );` 确实,Gender 不再为空。如何处理其他对象?

标签: c# entity-framework-core asp.net-core-webapi


【解决方案1】:

谢谢@ranton187 你救了我! 希望可以帮助其他人,这是我的问题的解决方案。 我在映射配置文件中添加了这个:

CreateMap() .ForMember(dto => dto.Genders, opt => opt.MapFrom(x => x.Gender)) .ForMember(dto => dto.UserAccountTypes, opt => opt.MapFrom(x => x.UserAccountType)) .ForMember(dto => dto.Trucks, opt => opt.MapFrom(x => x.Truck));

现在 Gender、UserAccountTypes 和 Truck 对象不再为空。

感谢你们两位的快速帮助!

【讨论】:

  • 不客气!
猜你喜欢
  • 2021-09-21
  • 1970-01-01
  • 2020-09-24
  • 2021-01-27
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
相关资源
最近更新 更多