实体框架核心.Include()问题

Joh*_*son 16 c# entity-framework-core

一直在玩ef核心,并且在include语句中遇到了问题.对于这个代码我得到2家公司,这是我所期望的.

public IEnumerable<Company> GetAllCompanies(HsDbContext db)
{
    var c = db.Company;
    return c;
}
Run Code Online (Sandbox Code Playgroud)

这回来了

[
    {
        "id":1,
        "companyName":"new",
        "admins":null,
        "employees":null,
        "courses":null
    },
    {
        "id":2,
        "companyName":"Test Company",
        "admins":null,
        "employees":null,
        "courses":null
    }
]
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,有2家公司,所有相关的属性都是null,因为我曾经使用过任何包含,这正是我的预期.现在,当我将方法更新为:

public IEnumerable<Company> GetAllCompanies(HsDbContext db)
{
    var c = db.Company
        .Include(t => t.Employees)
        .Include(t => t.Admins)
        .ToList();

    return c;
}
Run Code Online (Sandbox Code Playgroud)

这是它返回的内容:

[
    {
        "id":1,
        "companyName":"new",
        "admins":[
            {
                "id":2,
                "forename":"User",
                "surname":"1",
                "companyId":1
            }
        ]
    }
]
Run Code Online (Sandbox Code Playgroud)

它只返回一家公司,只包括管理员.为什么不包括这两家公司及其员工?

public class Company
{
    public int Id { get; set; }
    public string CompanyName { get; set; }
    public List<Admin> Admins { get; set; }
    public List<Employee> Employees { get; set; }
    public List<Course> Courses { get; set; }

    public string GetFullName()
    {
        return CompanyName;
    }
}

public class Employee
{
    public int Id { get; set; }
    public string Forename { get; set; }
    public string Surname { get; set; }
    public int CompanyId { get; set; }
    [ForeignKey("CompanyId")]
    public Company company { get; set; }

    public ICollection<EmployeeCourse> Employeecourses { get; set; }
}

public class Admin
{
    public int Id { get; set; }
    public string Forename { get; set; }
    public string Surname { get; set; }
    public int CompanyId { get; set; }
    [ForeignKey("CompanyId")]
    public Company Company { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Ash*_*Bye 26

我不确定你是否已经看到了这个问题的公认答案,但问题在于JSON Serializer如何处理循环引用.有关更多参考资料的完整详细信息和链接可以在上面的链接中找到,我建议深入研究这些内容,但简而言之,添加以下内容startup.cs将配置序列化程序以忽略循环引用:

services.AddMvc()
    .AddJsonOptions(options => {
        options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
    });
Run Code Online (Sandbox Code Playgroud)

  • 我不相信这个问题与JSON有任何关系. (3认同)

Nav*_*yot 6

确保您使用的是来自“Microsoft.EntityFrameworkCore”的 Include,而不是来自“System.Data.Entity”的 Include