ASP .NET Core Webapi父子关系?

时间:2018-12-18 13:18:13

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

我正在.net core 2.1中使用我的webapi

我有两个模型:

public class Project
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public ICollection<Task> Tasks { get; set; } //list of tasks

}

public class Task
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    [ForeignKey("Project")]
    public int ProjectId { get; set; } //project that task is included
    public Project Project { get; set; }
}

和DbContext:

public class TaskManagerDbContext : DbContext
{
    public TaskManagerDbContext(DbContextOptions<TaskManagerDbContext> options) 
      : base(options) { }

    public DbSet<Project> Projects { get; set; }
    public DbSet<Task> Tasks { get; set; }
}

我做了一个迁移和更新数据库。

下一步是使WebAPI控制器具有基于实体框架的“读/写”操作。

我的问题是,为什么当我尝试调试代码tasks时,列表未实现为Project?

我尝试了硬编码的任务和项目。一切正常,当我打电话给简单的api/Projects作为回应时,我得到了"tasks": null。您能帮我在WebApi控制器中关联该信息吗?

控制器看起来像这样:

[Route("api/[controller]")]
[ApiController]
public class ProjectsController : ControllerBase
{
    private readonly TaskManagerDbContext _context;

    public ProjectsController(TaskManagerDbContext context)
    {
        _context = context; //tasks in projects here are null
    }

    // GET: api/Projects
    [HttpGet]
    public IEnumerable<Project> GetProjects()
    {
        return _context.Projects;
    }
}

其标准控制器由框架生成。我可以通过生成的控制器很好地获得项目和任务。但是项目与tasks没有关系。

如何在tasks中加入Project

2 个答案:

答案 0 :(得分:0)

您可以使用如下所示的include。您将在项目集合中获得任务集合

// GET: api/Projects
    [HttpGet]
    public IEnumerable<Project> GetProjects()
    {
        return _context.Projects.Include(x=>x.Task);
    }

答案 1 :(得分:0)

编写您的GetProjects方法,如下所示:

[HttpGet]
public IEnumerable<Project> GetProjects()
{
    return _context.Projects.Include(p => p.Tasks).ToList();
}

然后要避免Self referencing loopConfigureServices类的Startup方法中添加以下配置:

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddMvc()
        .AddJsonOptions(
            options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
        );

    ...
}