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();
});
}
}