using Microsoft.EntityFrameworkCore; using StoreService.Database.Entities; namespace StoreService.Database; /// /// Entity Framework Core database context for the Store microservice. /// Defines DbSets and configures entity relationships & constraints. /// public class ApplicationContext : DbContext { #region Ctor public ApplicationContext(DbContextOptions options) : base(options) { } #endregion #region DbSets public DbSet StoreCategories => Set(); public DbSet StoreItems => Set(); public DbSet StoreDiscounts => Set(); public DbSet StoreDiscountItems => Set(); public DbSet StoreOrders => Set(); public DbSet StoreOrderItems => Set(); public DbSet StoreOrderItemDiscounts => Set(); #endregion #region ModelCreating protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // store_category modelBuilder.Entity(b => { b.ToTable("store_category"); b.HasKey(x => x.Id); b.Property(x => x.Title).HasMaxLength(256).IsRequired(); }); // store_item modelBuilder.Entity(b => { b.ToTable("store_item"); b.HasKey(x => x.Id); b.Property(x => x.ManaBuyPrice).IsRequired(); b.Property(x => x.ManaSellPrice).IsRequired(); b.Property(x => x.InventoryLimit).IsRequired(); b.Property(x => x.UnlimitedPurchase).HasDefaultValue(false); b.HasOne(x => x.Category) .WithMany(c => c.Items) .HasForeignKey(x => x.StoreCategoryId) .OnDelete(DeleteBehavior.Restrict); }); // store_discount modelBuilder.Entity(b => { b.ToTable("store_discount"); b.HasKey(x => x.Id); b.Property(x => x.Percentage).HasPrecision(5, 2); // up to 100.00 b.Property(x => x.FromDate).IsRequired(); b.Property(x => x.UntilDate).IsRequired(); b.Property(x => x.IsCanceled).HasDefaultValue(false); }); // store_discount_item (many-to-many manual mapping) modelBuilder.Entity(b => { b.ToTable("store_discount_item"); b.HasKey(x => x.Id); b.HasOne(x => x.Discount) .WithMany(d => d.DiscountItems) .HasForeignKey(x => x.StoreDiscountId) .OnDelete(DeleteBehavior.Cascade); b.HasOne(x => x.StoreItem) .WithMany(i => i.DiscountItems) .HasForeignKey(x => x.StoreItemId) .OnDelete(DeleteBehavior.Cascade); b.HasIndex(x => new { x.StoreDiscountId, x.StoreItemId }).IsUnique(); }); // store_order modelBuilder.Entity(b => { b.ToTable("store_order"); b.HasKey(x => x.Id); b.Property(x => x.UserId).IsRequired(); b.Property(x => x.CostUpdateDate).IsRequired(); b.Property(x => x.ItemsRedeemed).HasDefaultValue(false); }); // store_order_item modelBuilder.Entity(b => { b.ToTable("store_order_item"); b.HasKey(x => x.Id); b.Property(x => x.CalculatedPrice).IsRequired(); b.HasOne(x => x.Order) .WithMany(o => o.OrderItems) .HasForeignKey(x => x.StoreOrderId) .OnDelete(DeleteBehavior.Cascade); b.HasOne(x => x.StoreItem) .WithMany(i => i.OrderItems) .HasForeignKey(x => x.StoreItemId) .OnDelete(DeleteBehavior.Restrict); }); // store_order_item_discount modelBuilder.Entity(b => { b.ToTable("store_order_item_discount"); b.HasKey(x => x.Id); b.HasOne(x => x.OrderItem) .WithMany(oi => oi.AppliedDiscounts) .HasForeignKey(x => x.StoreOrderItemId) .OnDelete(DeleteBehavior.Cascade); b.HasOne(x => x.Discount) .WithMany(d => d.OrderItemDiscounts) .HasForeignKey(x => x.StoreDiscountId) .OnDelete(DeleteBehavior.Restrict); b.HasIndex(x => new { x.StoreOrderItemId, x.StoreDiscountId }).IsUnique(); }); } #endregion }