Backend für "Slip It In" mit ASP.NET Core erstellt
- Neues Backend-Projekt mit Entity Framework Core (PostgreSQL) und geteilten Modellen/DTOs angelegt - Datenbankstruktur und Migrations implementiert (User, Game, Player, Phrase, PlayerCard, GameRound, SlipChallenge) - SignalR-Hub für Spielkommunikation (Lobby, Spielstart, Kartenvergabe, Slip/Challenge) hinzugefügt - Spiellogik und DB-Zugriffe im GameService gekapselt - JWT-Authentifizierung und CORS für Entwicklung konfiguriert - Projektdateien, NuGet-Abhängigkeiten und .gitignore aktualisiert - Startkonfiguration und Umgebungsdateien angepasst
This commit is contained in:
432
SlipItIn.Server/Migrations/20260723193505_InitialCreate.Designer.cs
generated
Normal file
432
SlipItIn.Server/Migrations/20260723193505_InitialCreate.Designer.cs
generated
Normal file
@@ -0,0 +1,432 @@
|
||||
// <auto-generated />
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||
using SlipItIn.Server.Data;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace SlipItIn.Server.Migrations
|
||||
{
|
||||
[DbContext(typeof(SlipItInDbContext))]
|
||||
[Migration("20260723193505_InitialCreate")]
|
||||
partial class InitialCreate
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||
{
|
||||
#pragma warning disable 612, 618
|
||||
modelBuilder
|
||||
.HasAnnotation("ProductVersion", "10.0.10")
|
||||
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
||||
|
||||
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.Game", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("integer");
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<DateTime>("CreatedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<DateTime?>("EndedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<int>("HostId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<string>("LobbyCode")
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
|
||||
b.Property<int>("MaxPlayers")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("RoundDurationSeconds")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<DateTime?>("StartedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<int>("Status")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("HostId");
|
||||
|
||||
b.HasIndex("LobbyCode")
|
||||
.IsUnique();
|
||||
|
||||
b.ToTable("Games");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.GameRound", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("integer");
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<DateTime?>("EndedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<int>("GameId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("RoundNumber")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<DateTime>("StartedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<int>("Status")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("GameId");
|
||||
|
||||
b.ToTable("GameRounds");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.Phrase", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("integer");
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<DateTime>("CreatedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<int>("CreatorId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<bool>("IsActive")
|
||||
.HasColumnType("boolean");
|
||||
|
||||
b.Property<string>("Text")
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("CreatorId");
|
||||
|
||||
b.ToTable("Phrases");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.Player", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("integer");
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<string>("ConnectionId")
|
||||
.HasColumnType("text");
|
||||
|
||||
b.Property<int>("FailedSlips")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("GameId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<bool>("IsReady")
|
||||
.HasColumnType("boolean");
|
||||
|
||||
b.Property<DateTime>("JoinedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<int>("Score")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("SuccessfulSlips")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("UserId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("UserId");
|
||||
|
||||
b.HasIndex("GameId", "UserId")
|
||||
.IsUnique();
|
||||
|
||||
b.ToTable("Players");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.PlayerCard", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("integer");
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<DateTime>("AssignedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<int>("GameRoundId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<bool>("IsUsed")
|
||||
.HasColumnType("boolean");
|
||||
|
||||
b.Property<int>("PhraseId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("PlayerId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("GameRoundId");
|
||||
|
||||
b.HasIndex("PhraseId");
|
||||
|
||||
b.HasIndex("PlayerId");
|
||||
|
||||
b.ToTable("PlayerCards");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.SlipChallenge", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("integer");
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<int>("ChallengingPlayerId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<DateTime>("CreatedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<int>("GameRoundId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<DateTime?>("ResolvedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<int>("Status")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("TargetCardId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("TargetPlayerId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("ChallengingPlayerId");
|
||||
|
||||
b.HasIndex("GameRoundId");
|
||||
|
||||
b.HasIndex("TargetCardId");
|
||||
|
||||
b.HasIndex("TargetPlayerId");
|
||||
|
||||
b.ToTable("SlipChallenges");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.User", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("integer");
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<DateTime>("CreatedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<string>("Email")
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
|
||||
b.Property<bool>("IsActive")
|
||||
.HasColumnType("boolean");
|
||||
|
||||
b.Property<string>("PasswordHash")
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
|
||||
b.Property<DateTime?>("UpdatedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<string>("Username")
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("Email")
|
||||
.IsUnique();
|
||||
|
||||
b.HasIndex("Username")
|
||||
.IsUnique();
|
||||
|
||||
b.ToTable("Users");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.Game", b =>
|
||||
{
|
||||
b.HasOne("SlipItIn.Shared.Models.User", "Host")
|
||||
.WithMany()
|
||||
.HasForeignKey("HostId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Host");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.GameRound", b =>
|
||||
{
|
||||
b.HasOne("SlipItIn.Shared.Models.Game", "Game")
|
||||
.WithMany("Rounds")
|
||||
.HasForeignKey("GameId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Game");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.Phrase", b =>
|
||||
{
|
||||
b.HasOne("SlipItIn.Shared.Models.User", "Creator")
|
||||
.WithMany()
|
||||
.HasForeignKey("CreatorId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Creator");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.Player", b =>
|
||||
{
|
||||
b.HasOne("SlipItIn.Shared.Models.Game", "Game")
|
||||
.WithMany("Players")
|
||||
.HasForeignKey("GameId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("SlipItIn.Shared.Models.User", "User")
|
||||
.WithMany("Players")
|
||||
.HasForeignKey("UserId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Game");
|
||||
|
||||
b.Navigation("User");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.PlayerCard", b =>
|
||||
{
|
||||
b.HasOne("SlipItIn.Shared.Models.GameRound", "GameRound")
|
||||
.WithMany("ActiveCards")
|
||||
.HasForeignKey("GameRoundId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("SlipItIn.Shared.Models.Phrase", "Phrase")
|
||||
.WithMany("PlayerCards")
|
||||
.HasForeignKey("PhraseId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("SlipItIn.Shared.Models.Player", "Player")
|
||||
.WithMany("Cards")
|
||||
.HasForeignKey("PlayerId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("GameRound");
|
||||
|
||||
b.Navigation("Phrase");
|
||||
|
||||
b.Navigation("Player");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.SlipChallenge", b =>
|
||||
{
|
||||
b.HasOne("SlipItIn.Shared.Models.Player", "ChallengingPlayer")
|
||||
.WithMany()
|
||||
.HasForeignKey("ChallengingPlayerId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("SlipItIn.Shared.Models.GameRound", "GameRound")
|
||||
.WithMany("Challenges")
|
||||
.HasForeignKey("GameRoundId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("SlipItIn.Shared.Models.PlayerCard", "TargetCard")
|
||||
.WithMany()
|
||||
.HasForeignKey("TargetCardId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("SlipItIn.Shared.Models.Player", "TargetPlayer")
|
||||
.WithMany()
|
||||
.HasForeignKey("TargetPlayerId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("ChallengingPlayer");
|
||||
|
||||
b.Navigation("GameRound");
|
||||
|
||||
b.Navigation("TargetCard");
|
||||
|
||||
b.Navigation("TargetPlayer");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.Game", b =>
|
||||
{
|
||||
b.Navigation("Players");
|
||||
|
||||
b.Navigation("Rounds");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.GameRound", b =>
|
||||
{
|
||||
b.Navigation("ActiveCards");
|
||||
|
||||
b.Navigation("Challenges");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.Phrase", b =>
|
||||
{
|
||||
b.Navigation("PlayerCards");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.Player", b =>
|
||||
{
|
||||
b.Navigation("Cards");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.User", b =>
|
||||
{
|
||||
b.Navigation("Players");
|
||||
});
|
||||
#pragma warning restore 612, 618
|
||||
}
|
||||
}
|
||||
}
|
||||
319
SlipItIn.Server/Migrations/20260723193505_InitialCreate.cs
Normal file
319
SlipItIn.Server/Migrations/20260723193505_InitialCreate.cs
Normal file
@@ -0,0 +1,319 @@
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace SlipItIn.Server.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class InitialCreate : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.CreateTable(
|
||||
name: "Users",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<int>(type: "integer", nullable: false)
|
||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||
Username = table.Column<string>(type: "text", nullable: false),
|
||||
Email = table.Column<string>(type: "text", nullable: false),
|
||||
PasswordHash = table.Column<string>(type: "text", nullable: false),
|
||||
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
|
||||
IsActive = table.Column<bool>(type: "boolean", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_Users", x => x.Id);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "Games",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<int>(type: "integer", nullable: false)
|
||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||
LobbyCode = table.Column<string>(type: "text", nullable: false),
|
||||
HostId = table.Column<int>(type: "integer", nullable: false),
|
||||
Status = table.Column<int>(type: "integer", nullable: false),
|
||||
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||
StartedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
|
||||
EndedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
|
||||
MaxPlayers = table.Column<int>(type: "integer", nullable: false),
|
||||
RoundDurationSeconds = table.Column<int>(type: "integer", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_Games", x => x.Id);
|
||||
table.ForeignKey(
|
||||
name: "FK_Games_Users_HostId",
|
||||
column: x => x.HostId,
|
||||
principalTable: "Users",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "Phrases",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<int>(type: "integer", nullable: false)
|
||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||
Text = table.Column<string>(type: "text", nullable: false),
|
||||
CreatorId = table.Column<int>(type: "integer", nullable: false),
|
||||
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||
IsActive = table.Column<bool>(type: "boolean", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_Phrases", x => x.Id);
|
||||
table.ForeignKey(
|
||||
name: "FK_Phrases_Users_CreatorId",
|
||||
column: x => x.CreatorId,
|
||||
principalTable: "Users",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "GameRounds",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<int>(type: "integer", nullable: false)
|
||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||
GameId = table.Column<int>(type: "integer", nullable: false),
|
||||
RoundNumber = table.Column<int>(type: "integer", nullable: false),
|
||||
Status = table.Column<int>(type: "integer", nullable: false),
|
||||
StartedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||
EndedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_GameRounds", x => x.Id);
|
||||
table.ForeignKey(
|
||||
name: "FK_GameRounds_Games_GameId",
|
||||
column: x => x.GameId,
|
||||
principalTable: "Games",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "Players",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<int>(type: "integer", nullable: false)
|
||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||
UserId = table.Column<int>(type: "integer", nullable: false),
|
||||
GameId = table.Column<int>(type: "integer", nullable: false),
|
||||
Score = table.Column<int>(type: "integer", nullable: false),
|
||||
SuccessfulSlips = table.Column<int>(type: "integer", nullable: false),
|
||||
FailedSlips = table.Column<int>(type: "integer", nullable: false),
|
||||
JoinedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||
IsReady = table.Column<bool>(type: "boolean", nullable: false),
|
||||
ConnectionId = table.Column<string>(type: "text", nullable: true)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_Players", x => x.Id);
|
||||
table.ForeignKey(
|
||||
name: "FK_Players_Games_GameId",
|
||||
column: x => x.GameId,
|
||||
principalTable: "Games",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
table.ForeignKey(
|
||||
name: "FK_Players_Users_UserId",
|
||||
column: x => x.UserId,
|
||||
principalTable: "Users",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "PlayerCards",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<int>(type: "integer", nullable: false)
|
||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||
PlayerId = table.Column<int>(type: "integer", nullable: false),
|
||||
PhraseId = table.Column<int>(type: "integer", nullable: false),
|
||||
GameRoundId = table.Column<int>(type: "integer", nullable: false),
|
||||
IsUsed = table.Column<bool>(type: "boolean", nullable: false),
|
||||
AssignedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_PlayerCards", x => x.Id);
|
||||
table.ForeignKey(
|
||||
name: "FK_PlayerCards_GameRounds_GameRoundId",
|
||||
column: x => x.GameRoundId,
|
||||
principalTable: "GameRounds",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
table.ForeignKey(
|
||||
name: "FK_PlayerCards_Phrases_PhraseId",
|
||||
column: x => x.PhraseId,
|
||||
principalTable: "Phrases",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
table.ForeignKey(
|
||||
name: "FK_PlayerCards_Players_PlayerId",
|
||||
column: x => x.PlayerId,
|
||||
principalTable: "Players",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "SlipChallenges",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<int>(type: "integer", nullable: false)
|
||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||
GameRoundId = table.Column<int>(type: "integer", nullable: false),
|
||||
ChallengingPlayerId = table.Column<int>(type: "integer", nullable: false),
|
||||
TargetPlayerId = table.Column<int>(type: "integer", nullable: false),
|
||||
TargetCardId = table.Column<int>(type: "integer", nullable: false),
|
||||
Status = table.Column<int>(type: "integer", nullable: false),
|
||||
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||
ResolvedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_SlipChallenges", x => x.Id);
|
||||
table.ForeignKey(
|
||||
name: "FK_SlipChallenges_GameRounds_GameRoundId",
|
||||
column: x => x.GameRoundId,
|
||||
principalTable: "GameRounds",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
table.ForeignKey(
|
||||
name: "FK_SlipChallenges_PlayerCards_TargetCardId",
|
||||
column: x => x.TargetCardId,
|
||||
principalTable: "PlayerCards",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
table.ForeignKey(
|
||||
name: "FK_SlipChallenges_Players_ChallengingPlayerId",
|
||||
column: x => x.ChallengingPlayerId,
|
||||
principalTable: "Players",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
table.ForeignKey(
|
||||
name: "FK_SlipChallenges_Players_TargetPlayerId",
|
||||
column: x => x.TargetPlayerId,
|
||||
principalTable: "Players",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_GameRounds_GameId",
|
||||
table: "GameRounds",
|
||||
column: "GameId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Games_HostId",
|
||||
table: "Games",
|
||||
column: "HostId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Games_LobbyCode",
|
||||
table: "Games",
|
||||
column: "LobbyCode",
|
||||
unique: true);
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Phrases_CreatorId",
|
||||
table: "Phrases",
|
||||
column: "CreatorId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_PlayerCards_GameRoundId",
|
||||
table: "PlayerCards",
|
||||
column: "GameRoundId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_PlayerCards_PhraseId",
|
||||
table: "PlayerCards",
|
||||
column: "PhraseId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_PlayerCards_PlayerId",
|
||||
table: "PlayerCards",
|
||||
column: "PlayerId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Players_GameId_UserId",
|
||||
table: "Players",
|
||||
columns: new[] { "GameId", "UserId" },
|
||||
unique: true);
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Players_UserId",
|
||||
table: "Players",
|
||||
column: "UserId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_SlipChallenges_ChallengingPlayerId",
|
||||
table: "SlipChallenges",
|
||||
column: "ChallengingPlayerId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_SlipChallenges_GameRoundId",
|
||||
table: "SlipChallenges",
|
||||
column: "GameRoundId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_SlipChallenges_TargetCardId",
|
||||
table: "SlipChallenges",
|
||||
column: "TargetCardId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_SlipChallenges_TargetPlayerId",
|
||||
table: "SlipChallenges",
|
||||
column: "TargetPlayerId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Users_Email",
|
||||
table: "Users",
|
||||
column: "Email",
|
||||
unique: true);
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Users_Username",
|
||||
table: "Users",
|
||||
column: "Username",
|
||||
unique: true);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropTable(
|
||||
name: "SlipChallenges");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "PlayerCards");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "GameRounds");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "Phrases");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "Players");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "Games");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "Users");
|
||||
}
|
||||
}
|
||||
}
|
||||
429
SlipItIn.Server/Migrations/SlipItInDbContextModelSnapshot.cs
Normal file
429
SlipItIn.Server/Migrations/SlipItInDbContextModelSnapshot.cs
Normal file
@@ -0,0 +1,429 @@
|
||||
// <auto-generated />
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||
using SlipItIn.Server.Data;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace SlipItIn.Server.Migrations
|
||||
{
|
||||
[DbContext(typeof(SlipItInDbContext))]
|
||||
partial class SlipItInDbContextModelSnapshot : ModelSnapshot
|
||||
{
|
||||
protected override void BuildModel(ModelBuilder modelBuilder)
|
||||
{
|
||||
#pragma warning disable 612, 618
|
||||
modelBuilder
|
||||
.HasAnnotation("ProductVersion", "10.0.10")
|
||||
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
||||
|
||||
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.Game", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("integer");
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<DateTime>("CreatedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<DateTime?>("EndedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<int>("HostId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<string>("LobbyCode")
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
|
||||
b.Property<int>("MaxPlayers")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("RoundDurationSeconds")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<DateTime?>("StartedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<int>("Status")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("HostId");
|
||||
|
||||
b.HasIndex("LobbyCode")
|
||||
.IsUnique();
|
||||
|
||||
b.ToTable("Games");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.GameRound", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("integer");
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<DateTime?>("EndedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<int>("GameId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("RoundNumber")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<DateTime>("StartedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<int>("Status")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("GameId");
|
||||
|
||||
b.ToTable("GameRounds");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.Phrase", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("integer");
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<DateTime>("CreatedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<int>("CreatorId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<bool>("IsActive")
|
||||
.HasColumnType("boolean");
|
||||
|
||||
b.Property<string>("Text")
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("CreatorId");
|
||||
|
||||
b.ToTable("Phrases");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.Player", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("integer");
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<string>("ConnectionId")
|
||||
.HasColumnType("text");
|
||||
|
||||
b.Property<int>("FailedSlips")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("GameId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<bool>("IsReady")
|
||||
.HasColumnType("boolean");
|
||||
|
||||
b.Property<DateTime>("JoinedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<int>("Score")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("SuccessfulSlips")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("UserId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("UserId");
|
||||
|
||||
b.HasIndex("GameId", "UserId")
|
||||
.IsUnique();
|
||||
|
||||
b.ToTable("Players");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.PlayerCard", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("integer");
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<DateTime>("AssignedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<int>("GameRoundId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<bool>("IsUsed")
|
||||
.HasColumnType("boolean");
|
||||
|
||||
b.Property<int>("PhraseId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("PlayerId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("GameRoundId");
|
||||
|
||||
b.HasIndex("PhraseId");
|
||||
|
||||
b.HasIndex("PlayerId");
|
||||
|
||||
b.ToTable("PlayerCards");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.SlipChallenge", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("integer");
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<int>("ChallengingPlayerId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<DateTime>("CreatedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<int>("GameRoundId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<DateTime?>("ResolvedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<int>("Status")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("TargetCardId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("TargetPlayerId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("ChallengingPlayerId");
|
||||
|
||||
b.HasIndex("GameRoundId");
|
||||
|
||||
b.HasIndex("TargetCardId");
|
||||
|
||||
b.HasIndex("TargetPlayerId");
|
||||
|
||||
b.ToTable("SlipChallenges");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.User", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("integer");
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<DateTime>("CreatedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<string>("Email")
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
|
||||
b.Property<bool>("IsActive")
|
||||
.HasColumnType("boolean");
|
||||
|
||||
b.Property<string>("PasswordHash")
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
|
||||
b.Property<DateTime?>("UpdatedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<string>("Username")
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("Email")
|
||||
.IsUnique();
|
||||
|
||||
b.HasIndex("Username")
|
||||
.IsUnique();
|
||||
|
||||
b.ToTable("Users");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.Game", b =>
|
||||
{
|
||||
b.HasOne("SlipItIn.Shared.Models.User", "Host")
|
||||
.WithMany()
|
||||
.HasForeignKey("HostId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Host");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.GameRound", b =>
|
||||
{
|
||||
b.HasOne("SlipItIn.Shared.Models.Game", "Game")
|
||||
.WithMany("Rounds")
|
||||
.HasForeignKey("GameId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Game");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.Phrase", b =>
|
||||
{
|
||||
b.HasOne("SlipItIn.Shared.Models.User", "Creator")
|
||||
.WithMany()
|
||||
.HasForeignKey("CreatorId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Creator");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.Player", b =>
|
||||
{
|
||||
b.HasOne("SlipItIn.Shared.Models.Game", "Game")
|
||||
.WithMany("Players")
|
||||
.HasForeignKey("GameId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("SlipItIn.Shared.Models.User", "User")
|
||||
.WithMany("Players")
|
||||
.HasForeignKey("UserId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Game");
|
||||
|
||||
b.Navigation("User");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.PlayerCard", b =>
|
||||
{
|
||||
b.HasOne("SlipItIn.Shared.Models.GameRound", "GameRound")
|
||||
.WithMany("ActiveCards")
|
||||
.HasForeignKey("GameRoundId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("SlipItIn.Shared.Models.Phrase", "Phrase")
|
||||
.WithMany("PlayerCards")
|
||||
.HasForeignKey("PhraseId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("SlipItIn.Shared.Models.Player", "Player")
|
||||
.WithMany("Cards")
|
||||
.HasForeignKey("PlayerId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("GameRound");
|
||||
|
||||
b.Navigation("Phrase");
|
||||
|
||||
b.Navigation("Player");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.SlipChallenge", b =>
|
||||
{
|
||||
b.HasOne("SlipItIn.Shared.Models.Player", "ChallengingPlayer")
|
||||
.WithMany()
|
||||
.HasForeignKey("ChallengingPlayerId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("SlipItIn.Shared.Models.GameRound", "GameRound")
|
||||
.WithMany("Challenges")
|
||||
.HasForeignKey("GameRoundId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("SlipItIn.Shared.Models.PlayerCard", "TargetCard")
|
||||
.WithMany()
|
||||
.HasForeignKey("TargetCardId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("SlipItIn.Shared.Models.Player", "TargetPlayer")
|
||||
.WithMany()
|
||||
.HasForeignKey("TargetPlayerId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("ChallengingPlayer");
|
||||
|
||||
b.Navigation("GameRound");
|
||||
|
||||
b.Navigation("TargetCard");
|
||||
|
||||
b.Navigation("TargetPlayer");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.Game", b =>
|
||||
{
|
||||
b.Navigation("Players");
|
||||
|
||||
b.Navigation("Rounds");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.GameRound", b =>
|
||||
{
|
||||
b.Navigation("ActiveCards");
|
||||
|
||||
b.Navigation("Challenges");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.Phrase", b =>
|
||||
{
|
||||
b.Navigation("PlayerCards");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.Player", b =>
|
||||
{
|
||||
b.Navigation("Cards");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("SlipItIn.Shared.Models.User", b =>
|
||||
{
|
||||
b.Navigation("Players");
|
||||
});
|
||||
#pragma warning restore 612, 618
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user