using LANCommander.Launcher.Data.Models; using Microsoft.EntityFrameworkCore; namespace LANCommander.Launcher.Data { public class DatabaseContext : DbContext { public DatabaseContext() { } public DatabaseContext(DbContextOptions options) : base(options) { } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var dbPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "LANCommander.db"); optionsBuilder.UseSqlite($"Data Source={dbPath};Cache=Shared"); optionsBuilder.UseLazyLoadingProxies(); } protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); builder.Entity() .HasMany(g => g.Games) .WithMany(g => g.Genres); builder.Entity() .HasMany(c => c.Games) .WithMany(g => g.Categories); builder.Entity() .HasMany(c => c.Children) .WithOne(c => c.Parent) .IsRequired(false); builder.Entity() .HasMany(t => t.Games) .WithMany(g => g.Tags); builder.Entity() .HasMany(p => p.Games) .WithMany(g => g.Platforms); #region Game Relationships builder.Entity() .HasMany(g => g.MultiplayerModes) .WithOne(m => m.Game) .IsRequired(false) .OnDelete(DeleteBehavior.Cascade); builder.Entity() .HasMany(g => g.Media) .WithOne(m => m.Game) .IsRequired(false) .OnDelete(DeleteBehavior.Cascade); builder.Entity() .HasMany(g => g.Developers) .WithMany(c => c.DevelopedGames) .UsingEntity>( "GameDeveloper", g => g.HasOne().WithMany().HasForeignKey("DeveloperId"), g => g.HasOne().WithMany().HasForeignKey("GameId") ); builder.Entity() .HasMany(g => g.Publishers) .WithMany(c => c.PublishedGames) .UsingEntity>( "GamePublisher", g => g.HasOne().WithMany().HasForeignKey("PublisherId"), g => g.HasOne().WithMany().HasForeignKey("GameId") ); builder.Entity() .HasMany(g => g.Redistributables) .WithMany(r => r.Games) .UsingEntity>( "GameRedistributable", gr => gr.HasOne().WithMany().HasForeignKey("RedistributableId"), gr => gr.HasOne().WithMany().HasForeignKey("GameId") ); builder.Entity() .HasMany(g => g.DependentGames) .WithOne(g => g.BaseGame) .IsRequired(false) .OnDelete(DeleteBehavior.SetNull); builder.Entity() .HasOne(g => g.Engine) .WithMany(e => e.Games) .IsRequired(false) .OnDelete(DeleteBehavior.SetNull); #endregion #region Collection Relationships builder.Entity() .HasMany(c => c.Games) .WithMany(g => g.Collections) .UsingEntity>( "CollectionGame", cg => cg.HasOne().WithMany().HasForeignKey("GameId"), cg => cg.HasOne().WithMany().HasForeignKey("CollectionId") ); #endregion } public DbSet? Games { get; set; } public DbSet? Genres { get; set; } public DbSet? Categories { get; set; } public DbSet? Tags { get; set; } public DbSet? Companies { get; set; } public DbSet? Redistributables { get; set; } public DbSet? Media { get; set; } } }