campus-errand/server/Data/AppDbContext.cs
2026-03-12 18:12:10 +08:00

177 lines
6.6 KiB
C#

using CampusErrand.Models;
using Microsoft.EntityFrameworkCore;
namespace CampusErrand.Data;
/// <summary>
/// 应用数据库上下文
/// </summary>
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
public DbSet<User> Users => Set<User>();
public DbSet<Banner> Banners => Set<Banner>();
public DbSet<ServiceEntry> ServiceEntries => Set<ServiceEntry>();
public DbSet<Order> Orders => Set<Order>();
public DbSet<FoodOrderItem> FoodOrderItems => Set<FoodOrderItem>();
public DbSet<Shop> Shops => Set<Shop>();
public DbSet<ShopBanner> ShopBanners => Set<ShopBanner>();
public DbSet<Dish> Dishes => Set<Dish>();
public DbSet<Review> Reviews => Set<Review>();
public DbSet<PriceChange> PriceChanges => Set<PriceChange>();
public DbSet<Appeal> Appeals => Set<Appeal>();
public DbSet<Earning> Earnings => Set<Earning>();
public DbSet<Withdrawal> Withdrawals => Set<Withdrawal>();
public DbSet<CommissionRule> CommissionRules => Set<CommissionRule>();
public DbSet<SystemMessage> SystemMessages => Set<SystemMessage>();
public DbSet<MessageRead> MessageReads => Set<MessageRead>();
public DbSet<SystemConfig> SystemConfigs => Set<SystemConfig>();
public DbSet<RunnerCertification> RunnerCertifications => Set<RunnerCertification>();
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// 用户表索引
modelBuilder.Entity<User>(entity =>
{
entity.HasIndex(e => e.OpenId).IsUnique();
entity.HasIndex(e => e.Phone);
entity.Property(e => e.Role).HasConversion<string>();
});
// Banner 表
modelBuilder.Entity<Banner>(entity =>
{
entity.HasIndex(e => e.SortOrder);
entity.Property(e => e.LinkType).HasConversion<string>();
});
// 服务入口表
modelBuilder.Entity<ServiceEntry>(entity =>
{
entity.HasIndex(e => e.SortOrder);
});
// 订单表
modelBuilder.Entity<Order>(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<string>();
entity.Property(e => e.Status).HasConversion<string>();
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<FoodOrderItem>(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<Shop>(entity =>
{
entity.Property(e => e.PackingFeeType).HasConversion<string>();
});
// 门店 Banner 表
modelBuilder.Entity<ShopBanner>(entity =>
{
entity.HasIndex(e => e.ShopId);
});
// 菜品表
modelBuilder.Entity<Dish>(entity =>
{
entity.HasIndex(e => e.ShopId);
});
// 评价表
modelBuilder.Entity<Review>(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<PriceChange>(entity =>
{
entity.HasIndex(e => e.OrderId);
entity.Property(e => e.ChangeType).HasConversion<string>();
entity.Property(e => e.Status).HasConversion<string>();
// 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<Appeal>(entity =>
{
entity.HasIndex(e => e.OrderId);
});
// 收益表
modelBuilder.Entity<Earning>(entity =>
{
entity.HasIndex(e => e.UserId);
entity.HasIndex(e => e.OrderId);
entity.Property(e => e.Status).HasConversion<string>();
// 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<Withdrawal>(entity =>
{
entity.HasIndex(e => e.UserId);
entity.Property(e => e.PaymentMethod).HasConversion<string>();
entity.Property(e => e.Status).HasConversion<string>();
});
// 佣金规则表
modelBuilder.Entity<CommissionRule>(entity =>
{
entity.Property(e => e.RateType).HasConversion<string>();
});
// 系统消息表
modelBuilder.Entity<SystemMessage>(entity =>
{
entity.Property(e => e.TargetType).HasConversion<string>();
});
// 消息已读表
modelBuilder.Entity<MessageRead>(entity =>
{
entity.HasIndex(e => new { e.UserId, e.MessageType, e.MessageId }).IsUnique();
entity.Property(e => e.MessageType).HasConversion<string>();
});
// 系统配置表
modelBuilder.Entity<SystemConfig>(entity =>
{
entity.HasIndex(e => e.Key).IsUnique();
});
// 跑腿认证表
modelBuilder.Entity<RunnerCertification>(entity =>
{
entity.HasIndex(e => e.UserId);
entity.Property(e => e.Status).HasConversion<string>();
});
}
}