Итак, у меня есть игра, и при попытке войти в игру класс 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
документации, но, видимо, это не сработало.
Дополнительно снимок экрана процесса отладки: Отладка
Заранее спасибо.