diff --git a/src/GameIdeas/GameIdeas.Shared/Model/Game.cs b/src/GameIdeas/GameIdeas.Shared/Model/Game.cs index a3c1e9e..038b580 100644 --- a/src/GameIdeas/GameIdeas.Shared/Model/Game.cs +++ b/src/GameIdeas/GameIdeas.Shared/Model/Game.cs @@ -11,7 +11,7 @@ public partial class Game GameDevelopers = new HashSet(); } - public int Id { get; set; } + public Guid Id { get; set; } public string Title { get; set; } = null!; public DateTime? ReleaseDate { get; set; } public DateTime CreationDate { get; set; } diff --git a/src/GameIdeas/GameIdeas.Shared/Model/User.cs b/src/GameIdeas/GameIdeas.Shared/Model/User.cs index 22d2678..29f2a95 100644 --- a/src/GameIdeas/GameIdeas.Shared/Model/User.cs +++ b/src/GameIdeas/GameIdeas.Shared/Model/User.cs @@ -8,7 +8,7 @@ public partial class User ModificationGames = new HashSet(); } - public Guid Id { get; set; } + public int Id { get; set; } public string Username { get; set; } = null!; public string Password { get; set; } = null!; public int Role { get; set; } diff --git a/src/GameIdeas/Server/GameIdeas.WebAPI/Context/GameIdeasContext.cs b/src/GameIdeas/Server/GameIdeas.WebAPI/Context/GameIdeasContext.cs index 0ac64be..ad2976f 100644 --- a/src/GameIdeas/Server/GameIdeas.WebAPI/Context/GameIdeasContext.cs +++ b/src/GameIdeas/Server/GameIdeas.WebAPI/Context/GameIdeasContext.cs @@ -6,15 +6,25 @@ namespace GameIdeas.WebAPI.Context; public class GameIdeasContext : DbContext { private ILoggerFactory LoggerFactory; + public GameIdeasContext(DbContextOptions option, ILoggerFactory loggerFactory) : base(option) { LoggerFactory = loggerFactory; } - public virtual DbSet Games { get; set; } = null!; + public virtual DbSet Users { get; set; } = null!; + public virtual DbSet Developers { get; set; } = null!; public virtual DbSet Platforms { get; set; } = null!; + public virtual DbSet Properties { get; set; } = null!; + public virtual DbSet Publishers { get; set; } = null!; + public virtual DbSet Tags { get; set; } = null!; + public virtual DbSet Games { get; set; } = null!; + public virtual DbSet GameDevelopers { get; set; } = null!; public virtual DbSet GamePlatforms { get; set; } = null!; + public virtual DbSet GameProperties { get; set; } = null!; + public virtual DbSet GamePublishers { get; set; } = null!; + public virtual DbSet GameTags { get; set; } = null!; protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { @@ -24,6 +34,135 @@ public class GameIdeasContext : DbContext protected override void OnModelCreating(ModelBuilder modelBuilder) { + modelBuilder.Entity(entity => { + entity.ToTable("User"); + + entity.Property(e => e.Id) + .UseIdentityByDefaultColumn() + .HasIdentityOptions(startValue: 100000); + }); + + modelBuilder.Entity(entity => entity.ToTable("Developer")); + + modelBuilder.Entity(entity => entity.ToTable("Platform")); + + modelBuilder.Entity(entity => entity.ToTable("Property")); + + modelBuilder.Entity(entity => entity.ToTable("Publisher")); + + modelBuilder.Entity(entity => entity.ToTable("Tag")); + + modelBuilder.Entity(entity => + { + entity.ToTable("Game"); + + entity.HasIndex(e => e.CreationUserId); + + entity.HasIndex(e => e.ModificationUserId); + + entity.Property(e => e.CreationDate) + .HasDefaultValueSql("now()"); + + entity.Property(e => e.Id) + .UseIdentityByDefaultColumn() + .HasIdentityOptions(startValue: 100000); + + entity.HasOne(d => d.CreationUser) + .WithMany(p => p.CreationGames) + .HasForeignKey(d => d.CreationUserId) + .OnDelete(DeleteBehavior.ClientSetNull); + + entity.HasOne(d => d.ModificationUser) + .WithMany(p => p.ModificationGames) + .HasForeignKey(d => d.ModificationUserId) + .OnDelete(DeleteBehavior.ClientSetNull); + }); + + modelBuilder.Entity(entity => + { + entity.ToTable("GameDeveloper"); + + entity.HasKey(e => new { e.GameId, e.DeveloperId }); + + entity.HasOne(d => d.Game) + .WithMany(p => p.GameDevelopers) + .HasForeignKey(d => d.GameId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Developer) + .WithMany(p => p.GameDevelopers) + .HasForeignKey(d => d.DeveloperId) + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity(entity => + { + entity.ToTable("GamePlatform"); + + entity.HasKey(e => new { e.GameId, e.PlatformId }); + + entity.HasOne(d => d.Game) + .WithMany(p => p.GamePlatforms) + .HasForeignKey(d => d.GameId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Platform) + .WithMany(p => p.GamePlatforms) + .HasForeignKey(d => d.PlatformId) + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity(entity => + { + entity.ToTable("GameProperty"); + + entity.HasKey(e => new { e.GameId, e.PropertyId }); + + entity.HasOne(d => d.Game) + .WithMany(p => p.GameProperties) + .HasForeignKey(d => d.GameId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Property) + .WithMany(p => p.GameProperties) + .HasForeignKey(d => d.PropertyId) + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity(entity => + { + entity.ToTable("GamePublisher"); + + entity.HasKey(e => new { e.GameId, e.PublisherId }); + + entity.HasOne(d => d.Game) + .WithMany(p => p.GamePublishers) + .HasForeignKey(d => d.GameId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Publisher) + .WithMany(p => p.GamePublishers) + .HasForeignKey(d => d.PublisherId) + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity(entity => + { + entity.ToTable("GameTag"); + + entity.HasKey(e => new { e.GameId, e.TagId }); + + entity.HasOne(d => d.Game) + .WithMany(p => p.GameTags) + .HasForeignKey(d => d.GameId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Tag) + .WithMany(p => p.GameTags) + .HasForeignKey(d => d.TagId) + .OnDelete(DeleteBehavior.Cascade); + }); + base.OnModelCreating(modelBuilder); } } diff --git a/src/GameIdeas/Server/GameIdeas.WebAPI/Program.cs b/src/GameIdeas/Server/GameIdeas.WebAPI/Program.cs index bbb1ee9..108fffa 100644 --- a/src/GameIdeas/Server/GameIdeas.WebAPI/Program.cs +++ b/src/GameIdeas/Server/GameIdeas.WebAPI/Program.cs @@ -15,6 +15,7 @@ Action> dbContextOptions = options => npgOption.CommandTimeout(60); npgOption.MigrationsAssembly("GameIdeas.WebAPI"); }); + }; // Add services to the container.