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
}