ThenInclude添加了我没有包含的导航表

时间:2018-05-05 15:38:20

标签: c# entity-framework-core

我有3个代码第一个表,“锦标赛”“日程”和“游戏”

class Tournament
  public int Id { get; set; }
  public string Name { get; set; }
  //relationship to schedule
  public ICollection<Schedule> Schedule { get; set; }

class Schedule
  public int Id { get; set; }
  public DateTime Date { get; set; }

  //relation to game
  public Game Game { get; set; }
  public int GameId { get; set; }

class Game
  public int Id { get; set; }

  //relation to schedule
  public ICollection<Schedule> Schedule { get; set; }

锦标赛有一对多的赛程,赛程有一场比赛,所有桌子全部连接。如上所述。

现在,我希望通过赛程和比赛获得所有锦标赛 所以,代码在

之下
 var tournament = _context.Tournament
 .Include(t => t.Schedule)
 .ThenInclude(game => game.Game);

问题是,

我正在参加锦标赛,并在一场锦标赛中获得赛程信息和内线赛程信息。

但我也在游戏中获得日程安排。 但是,我没有指定在游戏的时间表内获取数据。

如何避免获取此冗余信息。 我的表格结构有问题吗?

退回的对象。

{
    "id": 2,
    "name": "Professional League 2018",
    "schedule": [
      {
        "id": 2,
        "date": "0001-01-01T00:00:00",
        "gameId": 5,
        "game": {
          "id": 5,
          "name": "League of Legend",

          "schedule": [ //This information i want to removed.
            {
              "id": 4,
              "date": "0001-01-01T00:00:00",
              "gameId": 5,

1 个答案:

答案 0 :(得分:0)

实体框架检测到记录属于多个路径,就像您的情况一样,即使它只从数据库中检索一次,所有路径都引用同一个内存中对象。

如果您不想退回该额外信息,则需要将其从序列化中排除:

class Tournament
  public int Id { get; set; }
  public string Name { get; set; }

  //relationship to schedule
  public ICollection<Schedule> Schedule { get; set; }

class Schedule
  public int Id { get; set; }
  public DateTime Date { get; set; }

  //relation to game
  public Game Game { get; set; }
  public int GameId { get; set; }

class Game
  public int Id { get; set; }

  //relation to schedule
  [JsonIgnore] //ignore when serializing with NewtonSoft.Json   
  public ICollection<Schedule> Schedule { get; set; }

但是,Tournament有一个Schedule的集合,这很奇怪。它不应该有一个Game的集合,而这个集合又有Schedule的集合吗?