From ca78d6ace44139823b6f292d61e0e786a5ddc374 Mon Sep 17 00:00:00 2001 From: Kleidukos Date: Sat, 23 May 2026 16:23:18 +0200 Subject: [PATCH] Setup DbContext --- OakArchive/Database/ApplicationDbContext.cs | 171 ++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 OakArchive/Database/ApplicationDbContext.cs diff --git a/OakArchive/Database/ApplicationDbContext.cs b/OakArchive/Database/ApplicationDbContext.cs new file mode 100644 index 0000000..c178ea1 --- /dev/null +++ b/OakArchive/Database/ApplicationDbContext.cs @@ -0,0 +1,171 @@ +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using OakArchive.Entities.CardMarket; +using OakArchive.Entities.Cards; +using OakArchive.Entities.Collection; +using OakArchive.Entities.Grading; +using OakArchive.Entities.Serie; +using OakArchive.Entities.Set; +using OakArchive.Entities.TCGdex; +using OakArchive.Entities.User; + +namespace OakArchive.Database; + +public class ApplicationDbContext : IdentityDbContext, Guid> +{ + public ApplicationDbContext(DbContextOptions options) : base(options) + { + } + + public DbSet Settings { get; set; } = null!; + public DbSet Collections { get; set; } = null!; + public DbSet CollectedCards { get; set; } = null!; + public DbSet Gradings { get; set; } = null!; + public DbSet TcgDexCardInfos { get; set; } = null!; + public DbSet TcgDexSetInfos { get; set; } = null!; + public DbSet TcgDexSeriesInfos { get; set; } = null!; + public DbSet Series { get; set; } = null!; + public DbSet Sets { get; set; } = null!; + public DbSet Legals { get; set; } = null!; + public DbSet CardCounts { get; set; } = null!; + public DbSet Cards { get; set; } = null!; + public DbSet Attacks { get; set; } = null!; + public DbSet Weaknesses { get; set; } = null!; + public DbSet CardMarketSetInfos { get; set; } = null!; + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + // 1. Basis-Mapping für ASP.NET Core Identity (Pflicht!) + base.OnModelCreating(modelBuilder); + + #region User & Settings + + modelBuilder.Entity(entity => + { + // Konfiguration für das private Feld 'DefaultCollection' als Backing Field + entity.Property("DefaultCollectionId"); + + entity.HasOne() + .WithMany() + .HasForeignKey("DefaultCollectionId") + .OnDelete(DeleteBehavior.Restrict); + + // n:m Beziehung zwischen Usern und Collections (Members) + entity.HasMany(u => u.Collections) + .WithMany(c => c.Members) + .UsingEntity(j => j.ToTable("UserCollections")); + }); + + modelBuilder.Entity() + .HasOne(s => s.User) + .WithOne(u => u.Settings) + .HasForeignKey(s => s.UserId) + .OnDelete(DeleteBehavior.Cascade); + + #endregion + + #region 1:1 TCGdex & CardMarket Mapping + + // EF Core mitgeteilt, auf welcher Seite der FK physisch liegt + modelBuilder.Entity() + .HasOne(c => c.TcgDexCardInfo) + .WithOne(t => t.Card) + .HasForeignKey(t => t.CardId) + .OnDelete(DeleteBehavior.Cascade); + + modelBuilder.Entity() + .HasOne(s => s.SetInfo) + .WithOne(t => t.Set) + .HasForeignKey(t => t.SetIdRef) + .OnDelete(DeleteBehavior.Cascade); + + modelBuilder.Entity() + .HasOne(s => s.TcgDexSeriesInfo) + .WithOne(t => t.Series) + .HasForeignKey(t => t.SeriesIdRef) + .OnDelete(DeleteBehavior.Cascade); + + modelBuilder.Entity() + .HasOne(s => s.CardCount) + .WithOne(c => c.Set) + .HasForeignKey(c => c.SetId) + .OnDelete(DeleteBehavior.Cascade); + + modelBuilder.Entity() + .HasOne(s => s.CardMarketSetInfo) + .WithOne(cms => cms.Set) + .HasForeignKey(cms => cms.SetId) + .OnDelete(DeleteBehavior.Cascade); + + // Auflösung der geteilten Legal-Tabelle + modelBuilder.Entity(entity => + { + entity.HasOne(l => l.Set) + .WithOne(s => s.Legal) + .HasForeignKey(l => l.SetId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(l => l.Card) + .WithOne(c => c.Legal) + .HasForeignKey(l => l.CardId) + .OnDelete(DeleteBehavior.Cascade); + }); + + #endregion + + #region Postgres JSONB Columns + + modelBuilder.Entity(entity => + { + entity.HasOne(c => c.Set) + .WithMany(s => s.Cards) + .HasForeignKey(c => c.SetId) + .OnDelete(DeleteBehavior.Restrict); + + // Native .NET Listen als JSONB in Postgres speichern + entity.Property(c => c.Variants).HasColumnType("jsonb"); + entity.Property(c => c.Types).HasColumnType("jsonb"); + }); + + modelBuilder.Entity(entity => + { + entity.HasOne(a => a.Card) + .WithMany(c => c.Attacks) + .HasForeignKey(a => a.CardId) + .OnDelete(DeleteBehavior.Cascade); + + entity.Property(a => a.Cost).HasColumnType("jsonb"); + }); + + #endregion + + #region CollectedCard & Grading + + modelBuilder.Entity(entity => + { + entity.HasOne(cc => cc.Collection) + .WithMany(c => c.Cards) + .HasForeignKey(cc => cc.CollectionId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(cc => cc.Card) + .WithMany() + .HasForeignKey(cc => cc.CardId) + .OnDelete(DeleteBehavior.Restrict); + + entity.HasOne(cc => cc.ScannedBy) + .WithMany() + .HasForeignKey(cc => cc.ScannedById) + .OnDelete(DeleteBehavior.Restrict); + }); + + modelBuilder.Entity() + .HasOne(g => g.CollectedCard) + .WithOne(cc => cc.Grading) + .HasForeignKey(g => g.CollectedCardId) + .OnDelete(DeleteBehavior.Cascade); + + #endregion + } +} \ No newline at end of file