177 lines
6.6 KiB
C#
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>();
|
|
});
|
|
}
|
|
}
|