EF Core не может вернуть данные из нескольких таблиц - PullRequest
0 голосов
/ 23 января 2020

Я работаю с EF Core. У меня есть структура таблицы, подобная этой:

public class User
{
    public User()
    {
        this.Projects = new HashSet<Project>();
    }

    [Key]
    public int Id { get; set; }
    public string name { get; set; }
    public string emailId { get; set; }

    public virtual ICollection<Project> Projects { get; set;}
}

public class Project
{   
    public Project()
    {
        this.TimeSheetData = new HashSet<TimeSheetData>();
    }

    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public int userId { get; set; }

    [ForeignKey("userId")]
    public virtual User User {get; set; }
    public virtual ICollection<TimeSheetData> TimeSheetData { get; set;}
}

public class TimeSheetData
{
    [Key]
    public int id { get; set; }
    public int project_id { get; set; }
    [ForeignKey("project_id")]
    public virtual Project Project {get; set; }
    public string hours_logged { get; set; }
}

------------

public List<User> GetTimeSheet(int userid)
{
    var data = _context.Users.Include(u => u.Projects)
                             .ThenInclude(p => p.TimeSheetData)
                             .AsNoTracking()
                             .Where(a => a.Id == userid)
                             .ToList();
    return data;
}

, которая возвращает:

[
    {
        "id": 101,
        "name": "Niranjan",
        "emailId": "godbole.niranjan@gmail.com",
        "projects": [
            {
                "id": 1,
                "name": "Niranjan",
                "userId": 101

Этот объект не включает данные расписания. Но когда я отлаживаю, мои данные, возвращенные из запроса, показывают все данные. Так что мне нужно изменить свою таблицу пользователей, чтобы она соответствовала данным расписания, но таблица пользователей содержит проекты, которые в свою очередь содержат расписание.

Может кто-нибудь помочь мне разобраться?

1 Ответ

1 голос
/ 23 января 2020

Вы можете встретить циклическую ссылку между User и Projects.

. Чтобы предотвратить циклическую ссылку, вы можете использовать следующий код при запуске ConfigureServices:

Для asp. net core 2.2:

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

Для asp. net core 3.0 (MVC / Web API), просто следуйте нижеприведенным шагам, чтобы преодолеть циклическую ссылку, используя Newtonsoft Json.

1.Установите Microsoft.AspNetCore.Mvc.NewtonsoftJson пакет (версия зависит от вашего проекта)

Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson -Version 3.0.0

2.Добавьте приведенный ниже код в startup.cs

services.AddControllersWithViews().AddNewtonsoftJson(x =>
        {
            x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        });
...