ASP .NET Core Webapi Parent - Дочерние отношения? - PullRequest
0 голосов
/ 18 декабря 2018

Я работаю над своим webapi в .net core 2.1

У меня есть две модели:

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; }
}

Я сделал миграцию иupdate-database.

Следующим шагом было создание контроллеров WebAPI с действием чтения / записи на основе платформы Entity.

Мой вопрос: почему, когда я пытаюсь отладить мой код, список 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 голосов
/ 18 декабря 2018

Напишите ваш метод GetProjects следующим образом:

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

Затем, чтобы избежать Self referencing loop, добавьте следующую конфигурацию в метод ConfigureServices класса Startup:

public void ConfigureServices(IServiceCollection services)
{
    ...

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

    ...
}
0 голосов
/ 18 декабря 2018

вы можете использовать, как показано ниже.И вы получите коллекцию задач внутри коллекции проектов

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