子资源在完全发展的EF Core关系中再次出现



我在EF Core中充分发展了大学与专业的1-多关系。

我需要显示大学a及其专业,但这些专业有对大学a的引用,而a显示为"JSON children"每一次,我不希望它被显示。

有什么办法可以解决这个问题吗?如果有人需要更多,这里的repo: https://github.com/nambonumestinvisibili/SGrade/tree/master/SGrade

主要
public class Major : IGradable
{
public University University { get; set; }
public int UniversityId {get;set;}
public ICollection<Subject> Subjects { get; set; }
public ICollection<Teacher> Teachers { get; set; }
public ICollection<ApplicationUser> Users { get; set; }
}

Major DTO:(Mapping is made with automapper)

public class MajorDTO : Major
{
public string Type { get; set; } = "Major";
}

大学

public class University : IGradable
{
public ICollection<Major> Majors { get; set; }
}

Uni回购

public class UniversityRepo : GradableRepo<University>, IUniversityRepo
{
public UniversityRepo(SGradeContext sgcontext) : base(sgcontext)
{
}
public async Task<University> GetPresentingUniversity(int id)
{
IQueryable<University> query = _context.Universities
//.Include(x => x.Reviews)
//.Include(x => x.Subjects.Take(5))
//.Include(x => x.Teachers.Take(5))
.Include(x => x.Majors);
return await query.Where(x => x.Id == id).FirstOrDefaultAsync();
}
}

控制器部分:

// GET: api/Universities/5
[HttpGet("{id}")]
public async Task<ActionResult<University>> GetUniversity(int id)
{
var university = await _repo.GetPresentingUniversity(id);
if (university == null)
{
return NotFound();
}
return _mapper.Map<University, UniversityDTO>(university);
}

反应:

{
"type": "University",          //this is university A
"majors": [
{
"university": {        //and here it is repeated
"majors": [],
"name": "Uniwersytet Wrocławski",
"starsRating": 2.5,
"reviews": null,
"isConfirmed": true,
"votes": 0,
"id": 3
},
"universityId": 3,
"subjects": null,
"teachers": null,
"users": null,
"name": "Informatyka",
"starsRating": 2.5,
"reviews": null,
"isConfirmed": true,
"votes": 0,
"id": 1
}
],
"name": "Uniwersytet Wrocławski",
"starsRating": 2.5,
"reviews": [],
"isConfirmed": true,
"votes": 0,
"id": 3
}

我在序列化一对多关系时遇到了类似的问题,这是一个技巧:

public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve;
options.JsonSerializerOptions.MaxDepth = 0;
});
}

检查它是否适合你。下面是EF Core 5中所有类型关系的演示项目,我在这里遇到了这个问题。https://github.com/mikuam/PrimeHotel/commit/ef47a9faeb8111e363adb921287ac9392cd50e97

然而,我必须承认,暴露在控制器中分类的Model并不理想,而拥有dto,只暴露你应该暴露的东西要好得多。更重要的是,你可以控制你解决关系的深度。

最新更新