我正在.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
?
答案 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 loop
在ConfigureServices
类的Startup
方法中添加以下配置:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddMvc()
.AddJsonOptions(
options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
);
...
}