using CampusErrand.Models; using Microsoft.EntityFrameworkCore; namespace CampusErrand.Data; /// /// 应用数据库上下文 /// public class AppDbContext : DbContext { public AppDbContext(DbContextOptions options) : base(options) { } public DbSet Users => Set(); public DbSet Banners => Set(); public DbSet ServiceEntries => Set(); public DbSet Orders => Set(); public DbSet FoodOrderItems => Set(); public DbSet Shops => Set(); public DbSet ShopBanners => Set(); public DbSet Dishes => Set(); public DbSet Reviews => Set(); public DbSet PriceChanges => Set(); public DbSet Appeals => Set(); public DbSet Earnings => Set(); public DbSet Withdrawals => Set(); public DbSet CommissionRules => Set(); public DbSet SystemMessages => Set(); public DbSet MessageReads => Set(); public DbSet SystemConfigs => Set(); public DbSet RunnerCertifications => Set(); protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 用户表索引 modelBuilder.Entity(entity => { entity.HasIndex(e => e.OpenId).IsUnique(); entity.HasIndex(e => e.Phone); entity.Property(e => e.Role).HasConversion(); }); // Banner 表 modelBuilder.Entity(entity => { entity.HasIndex(e => e.SortOrder); entity.Property(e => e.LinkType).HasConversion(); }); // 服务入口表 modelBuilder.Entity(entity => { entity.HasIndex(e => e.SortOrder); }); // 订单表 modelBuilder.Entity(entity => { entity.HasIndex(e => e.OrderNo).IsUnique(); entity.HasIndex(e => e.OwnerId); entity.HasIndex(e => e.RunnerId); entity.HasIndex(e => e.Status); entity.Property(e => e.OrderType).HasConversion(); entity.Property(e => e.Status).HasConversion(); entity.HasOne(e => e.Owner).WithMany().HasForeignKey(e => e.OwnerId).OnDelete(DeleteBehavior.Restrict); entity.HasOne(e => e.Runner).WithMany().HasForeignKey(e => e.RunnerId).OnDelete(DeleteBehavior.Restrict); }); // 美食街订单详情表 modelBuilder.Entity(entity => { entity.HasIndex(e => e.OrderId); // SQL Server 不允许多级联路径,设置为 Restrict entity.HasOne(e => e.Order).WithMany(o => o.FoodOrderItems).HasForeignKey(e => e.OrderId).OnDelete(DeleteBehavior.Restrict); entity.HasOne(e => e.Shop).WithMany().HasForeignKey(e => e.ShopId).OnDelete(DeleteBehavior.Restrict); entity.HasOne(e => e.Dish).WithMany().HasForeignKey(e => e.DishId).OnDelete(DeleteBehavior.Restrict); }); // 门店表 modelBuilder.Entity(entity => { entity.Property(e => e.PackingFeeType).HasConversion(); }); // 门店 Banner 表 modelBuilder.Entity(entity => { entity.HasIndex(e => e.ShopId); }); // 菜品表 modelBuilder.Entity(entity => { entity.HasIndex(e => e.ShopId); }); // 评价表 modelBuilder.Entity(entity => { entity.HasIndex(e => e.OrderId); entity.HasIndex(e => e.RunnerId); // SQL Server 多级联路径限制 entity.HasOne(e => e.Order).WithMany().HasForeignKey(e => e.OrderId).OnDelete(DeleteBehavior.Restrict); entity.HasOne(e => e.Runner).WithMany().HasForeignKey(e => e.RunnerId).OnDelete(DeleteBehavior.Restrict); }); // 改价记录表 modelBuilder.Entity(entity => { entity.HasIndex(e => e.OrderId); entity.Property(e => e.ChangeType).HasConversion(); entity.Property(e => e.Status).HasConversion(); // SQL Server 多级联路径限制 entity.HasOne(e => e.Order).WithMany().HasForeignKey(e => e.OrderId).OnDelete(DeleteBehavior.Restrict); entity.HasOne(e => e.Initiator).WithMany().HasForeignKey(e => e.InitiatorId).OnDelete(DeleteBehavior.Restrict); }); // 申诉记录表 modelBuilder.Entity(entity => { entity.HasIndex(e => e.OrderId); }); // 收益表 modelBuilder.Entity(entity => { entity.HasIndex(e => e.UserId); entity.HasIndex(e => e.OrderId); entity.Property(e => e.Status).HasConversion(); // SQL Server 多级联路径限制 entity.HasOne(e => e.User).WithMany().HasForeignKey(e => e.UserId).OnDelete(DeleteBehavior.Restrict); entity.HasOne(e => e.Order).WithMany().HasForeignKey(e => e.OrderId).OnDelete(DeleteBehavior.Restrict); }); // 提现记录表 modelBuilder.Entity(entity => { entity.HasIndex(e => e.UserId); entity.Property(e => e.PaymentMethod).HasConversion(); entity.Property(e => e.Status).HasConversion(); }); // 佣金规则表 modelBuilder.Entity(entity => { entity.Property(e => e.RateType).HasConversion(); }); // 系统消息表 modelBuilder.Entity(entity => { entity.Property(e => e.TargetType).HasConversion(); }); // 消息已读表 modelBuilder.Entity(entity => { entity.HasIndex(e => new { e.UserId, e.MessageType, e.MessageId }).IsUnique(); entity.Property(e => e.MessageType).HasConversion(); }); // 系统配置表 modelBuilder.Entity(entity => { entity.HasIndex(e => e.Key).IsUnique(); }); // 跑腿认证表 modelBuilder.Entity(entity => { entity.HasIndex(e => e.UserId); entity.Property(e => e.Status).HasConversion(); }); } }