Отношение один ко многим не отображается, список пуст C # - PullRequest
0 голосов
/ 18 октября 2019

Итак, у меня есть игра, и при попытке войти в игру класс Game должен получить Player, но это не так. Сама Player получает Game id. Player имеет Many to One отношение к игре. Использование Web APi и Entity Framework Core

Класс игры ниже:

public class Game
{
    public ICollection<Player> players { get; set; }
    public int ID { get; set; }
    public DateTime createdAt { get; set; }
    public DateTime? startedAt { get; set; }

    public Game( DateTime createdAt, DateTime startedAt, List<Player> players)
    {
        this.createdAt = createdAt;
        this.startedAt = startedAt;
        this.players = players;
    }

    public Game()
    {
        this.players = new List<Player>();
        this.createdAt = DateTime.Now;
        this.startedAt = null;
    }

    public void addPlayer(Player p)
    {
        players.Add(p);
    }

    public Game startGame()
    {
        startedAt = DateTime.Now;
        return this;
    }
}

Класс игрока:

public class Player : IObserver
{
    public int ID { get; set; }
    public string username { get; set; }
    public int experience { get; set; }
    public int gold { get; set; }
    public Tower tower { get; set; }
    public Turret turret { get; set; }
    public Subject subject { get; set; }
    public Army army { get; set; }
    public Game game { get; set; }

    public Player()
    {

    }

    public Player(string name, int exp, int cash)
    {
        username = name;
        experience = exp;
        gold = cash;

        tower = new Tower(this);
        turret = new Turret(this);
        subject = new Subject();
    }

Класс контекста базы данных:

public class HavanaContext: DbContext
{
    public HavanaContext()
    {

    }
    public HavanaContext(DbContextOptions<HavanaContext> options)
        : base(options)
    {

    }

    public DbSet<Player> Players { get; set; }
    public DbSet<Coordinates> Coordinates { get; set; }
    public DbSet<Tower> Towers { get; set; }
    public DbSet<Turret> Turrets { get; set; }
    public DbSet<Subject> Subjects { get; set; }
    public DbSet<Fighter> Fighters { get; set; }
    public DbSet<Army> Armies { get; set; }
    public DbSet<Game> Games { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Player>()
           .HasOne(p => p.tower)
           .WithOne(t => t.player)
           .HasForeignKey<Tower>(t => t.player_id)
           .OnDelete(Microsoft.EntityFrameworkCore.DeleteBehavior.Cascade);

        modelBuilder.Entity<Player>()
           .HasOne(p => p.turret)
           .WithOne(t => t.player)
           .HasForeignKey<Turret>(t => t.player_id)
           .OnDelete(Microsoft.EntityFrameworkCore.DeleteBehavior.Cascade);

        modelBuilder.Entity<Player>()
           .HasOne(p => p.army)
           .WithOne(a => a.player)
           .HasForeignKey<Army>(a => a.player_id)
           .OnDelete(Microsoft.EntityFrameworkCore.DeleteBehavior.Cascade);

        modelBuilder.Entity<Game>()
          .HasMany<Player>(g => g.players)
          .WithOne(p => p.game);

        modelBuilder.Entity<Player>()
           .HasOne(p => p.subject)
           .WithOne(s => s.player)
           .HasForeignKey<Subject>(s => s.player_id)
           .OnDelete(Microsoft.EntityFrameworkCore.DeleteBehavior.Cascade);
    }
}

Имеет отношение между игроком и игрой.

Метод вызова API:

        static async Task<Uri> CreateGameAsync(Player player)
    {
        HttpResponseMessage response = await client.PostAsJsonAsync(
        "api/games", player);
        response.EnsureSuccessStatusCode();

        return response.Headers.Location;
    }

GameController:

[Route("api/games")]
[ApiController]
public class GameController : ControllerBase
{
    private readonly HavanaContext _context;
    public int Qty { get; set; } = 0;

    public GameController(HavanaContext context)
    {
        _context = context;
    }

    // GET api/player/5/game
    [HttpPost()]
    public HttpResponseMessage CreateGame([FromBody] Player p)
    {
        if (p == null || p.game != null)
            return new HttpResponseMessage(HttpStatusCode.Unauthorized);

        var game = _context.Games.Where(x => x.startedAt == null).First();
        if (game != null)
        {
            game.addPlayer(p);
            if (game.players.Count == 2)
                game.startGame();
            p.game = game;
            _context.Games.Update(game);
        }
        else
        {
            var new_game = new Game();
            new_game.addPlayer(p);
            p.game = new_game;
            _context.Games.Update(new_game);
        }
        _context.Players.Update(p);
        _context.SaveChanges();

        return new HttpResponseMessage(HttpStatusCode.Accepted);
    }
}

При выполнении входа в систему, player list всегда пусто, не понимаетПытался изменить отношения с помощью Entity Framework документации, но, видимо, это не сработало.

Дополнительно снимок экрана процесса отладки: Отладка

Заранее спасибо.

...