首页 > 解决方案 > 使用 Include 显示属性值的问题

问题描述

我正在学习ASP.NET 核心并遇到此问题。我有两个外键属性,我想在我的GET方法中显示它们。该模型如下所示:

[Key]
public int WorkRoomId { get; set; }
[ForeignKey("Room")]
[Required]
public int RoomId { get; set; }
public Room Room { get; set; }
[ForeignKey("ApplicationUser")]
[Required]
public string Id { get; set; }
public virtual ApplicationUser Employee { get; set; }

ApplicationUseridentityUser,而我在 Controller 中的GET方法是:

public async Task<ActionResult<IEnumerable<WorkRoom>>> GetWorkRooms()
{
    var workRooms =await _context.WorkRooms
       .Include(i => i.Room)
       .Include(i => i.Employee)
       .ToListAsync();
    return workRooms;
}

当我“得到”这个时,我收到:

[
  {
    "workRoomId": 1,
    "roomId": 1,
    "room": {
      "roomId": 1,
      "roomName": "H-103"
    },
    "id": "0dadca05-5133-428c-936b-6b5569e33286",
    "employee": null
  }
]

为什么房间可以正常工作,而员工却不能?

我需要添加一些东西才能解决吗?

如果我可以正常显示“员工”,如何从 ApplicationUser 中只选择一些字段来显示,因为有很多字段我不需要显示?因为似乎选择功能仅显示 WorkRoom 中的属性供我选择。

标签: c#entity-frameworkasp.net-core

解决方案


对于您的此类模型,它将创建一个带有EmployeeId在数据库中命名的外键的表(您可以打开数据库以检查它是否正确。或者检查迁移文件)。但是您认为Id是外键,这就是为什么您设置了值Id但无法获取相关ApplicationUser数据的原因。

如下更改您的 WorkRoom 类,然后运行命令add migrationupdate database再次更新数据库:

public class WorkRoom
{
    [Key]
    public int WorkRoomId { get; set; }
    [ForeignKey("Room")]
    [Required]
    public int RoomId { get; set; }
    public Room Room { get; set; }
    [ForeignKey("Employee")]   //change here...
    [Required]
    public string Id { get; set; }
    public virtual ApplicationUser Employee { get; set; }
}

更新:

var workRooms =  _context.WorkRooms
                        .Include(i => i.Room)
                        .Include(i => i.Employee).Select(i=>new { 
                               Room = i.Room,
                               EmployeeId = i.Employee.Id,
                               i.WorkRoomId
                        }).ToList();

推荐阅读