需要C#Backend Pro!数据古怪

时间:2015-12-08 07:49:54

标签: c# entity-framework linq asp.net-web-api

这是我的代码

  public Tournament Read(int id)
    {
        using (var context = new DragonLairContext())
        {
            Tournament tournament = context.Tournaments
                 .Include(a => a.Game)
                    .Include(g => g.Game.Genre)
                    .Include(b => b.Groups.Select(g => g.Teams))
                    .Include(k => k.Groups.Select(y => y.Teams.Select(l => l.Players)))
                    .Include(c => c.TournamentType)
                    .FirstOrDefault(d => d.Id == id);
            return tournament;               
        }
    }

我使用API​​并且由于序列化问题,我需要将我的实体转换为DTOobject。

这是来自Dto Converter的片段

 public override DTOTournament Convert(Tournament t)
    {
        if (t.Game == null || t.TournamentType == null || t.Groups == null) throw new ArgumentException("Missing some data");
        DTOTournament dtoTournament = new DTOTournament();
        List<DTOGroup> dtoGroups = new List<DTOGroup>();

        DTOTournamentType dtoTournamentType = new DTOTournamentType() { Id = t.TournamentType.Id, Type = t.TournamentType.Type };


        foreach (var group in t.Groups)
        {
            if (group.Teams == null) return dtoTournament;
            List<DTOTeam> dtoTeams = new List<DTOTeam>();
            foreach (var team in group.Teams)
            {
                List<DTOPlayer> dtoPlayers = new List<DTOPlayer>();
                if (team.Players == null) return dtoTournament;
                foreach (var player in team.Players)
                {
                    dtoPlayers.Add(new DTOPlayer() { Id = player.Id, Name = player.Name });
                }
                dtoTeams.Add(new DTOTeam()
                {
                    Id = team.Id,
                    Name = team.Name,
                    Win = team.Win,
                    Loss = team.Loss,
                    Draw = team.Draw,
                    DtoPlayers = dtoPlayers
                });
            }
            dtoGroups.Add(new DTOGroup()
            {
                Id = group.Id,
                Name = group.Name,
                DtoTeams = dtoTeams,
                DtoTournament = dtoTournament
            });
        }

        dtoTournament.DTOTournamentType = dtoTournamentType;
        dtoTournament.Id = t.Id;
        dtoTournament.Name = t.Name;
        dtoTournament.StartDate = t.StartDate;
        dtoTournament.DtoGroups = dtoGroups;
        dtoTournament.DtoGame = new DTOGame() { Id = t.Game.Id, Name = t.Game.Name, DtoGenre = new DTOGenre() { Id = t.Game.Genre.Id, Name = t.Game.Genre.Name } };
        return dtoTournament;
    }

这里是Json

     {
  "$id": "1",
  "Id": 1,
  "Name": "I'm a Tournament",
  "StartDate": "2015-12-08T00:00:00",
  "DTOTournamentType": {
    "$id": "2",
    "Id": 1,
    "Type": "I'm type 2vs2",
    "DtoTournaments": null
  },
  "DtoGroups": [
    {
      "$id": "3",
      "Id": 1,
      "Name": "I'm a Group",
      "DtoTournament": {
        "$ref": "1"
      },
      "DtoTeams": [
        {
          "$id": "4",
          "Id": 1,
          "Draw": 0,
          "Loss": 0,
          "Win": 0,
          "Name": "I'm a Team",
          "DtoPlayers": [
            {
              "$id": "5",
              "Id": 1,
              "Name": "I'm a Group",
              "DtoTeams": null
            }
          ],
          "DtoGroups": null
        },
        {
          "$id": "6",
          "Id": 2,
          "Draw": 0,
          "Loss": 0,
          "Win": 0,
          "Name": "I'm a Team",
          "DtoPlayers": [
            {
              "$id": "7",
              "Id": 1,
              "Name": "I'm a Group",
              "DtoTeams": null
            }
          ],
          "DtoGroups": null
        }
      ]
    }
  ],
  "DtoGame": {
    "$id": "8",
    "Id": 1,
    "Name": "Im a Game - Wars",
    "DtoGenre": {
      "$id": "9",
      "Id": 1,
      "Name": "I'm Genre Roleplaying",
      "DtoGames": null
    },
    "DtoTournaments": null
  }
}

我的数据库包含3个玩家 - 注释转换为json

      [
  {
    "$id": "1",
    "Id": 1,
    "Name": "I'm player Søren",
    "DtoTeams": [
      {
        "$id": "2",
        "Id": 1,
        "Draw": 0,
        "Loss": 0,
        "Win": 0,
        "Name": "I'm a Team",
        "DtoPlayers": null,
        "DtoGroups": null
      }
    ]
  },
  {
    "$id": "3",
    "Id": 2,
    "Name": "I'm player Mark",
    "DtoTeams": [
      {
        "$id": "4",
        "Id": 1,
        "Draw": 0,
        "Loss": 0,
        "Win": 0,
        "Name": "I'm a Team",
        "DtoPlayers": null,
        "DtoGroups": null
      }
    ]
  },
  {
    "$id": "5",
    "Id": 3,
    "Name": "I'm player René",
    "DtoTeams": [
      {
        "$id": "6",
        "Id": 2,
        "Draw": 0,
        "Loss": 0,
        "Win": 0,
        "Name": "I'm a Team",
        "DtoPlayers": null,
        "DtoGroups": null
      }
    ]
  }
]

所以我的问题是我真的无法弄清楚的。为什么我的DtoPlayer.Name与DtoGroup.Name具有相同的名称。看看我的包含。

2 个答案:

答案 0 :(得分:2)

抛出此异常是因为您尝试使用未在数据库上下文之后从数据库中检索的属性。您可以在调试时查看数据,因为变量是在使用范围内定义的。您还应该在Group类上获取module.directive('reloadPage', ['$http', function ($http) { return { restrict: 'A', link: function ($scope, element, attrs) { $scope.refreshPage = function () { if($scope.refreshGamePage ==1) return true; else return false; }; $scope.$watch($scope.refreshPage, function (v) { if (v) { $scope.setGamePage(); // this function will contains code to refresh game page } }); } }; }]);

Teams

答案 1 :(得分:0)

由于您说您可以在调试模式下查看数据,请尝试使用此方法。

  Tournament tournament = context.Tournaments
            .Include(a => a.Game)
            .Include(g => g.Game.Genre)
            .Include(b => b.Groups)
            .Include(c => c.TournamentType).ToList()
            .FirstOrDefault(d => d.Id == id);