using Microsoft.EntityFrameworkCore; using FutureMailAPI.Models; namespace FutureMailAPI.Data { public class FutureMailDbContext : DbContext { public FutureMailDbContext(DbContextOptions options) : base(options) { } public DbSet Users { get; set; } public DbSet SentMails { get; set; } public DbSet ReceivedMails { get; set; } public DbSet TimeCapsules { get; set; } public DbSet OAuthClients { get; set; } public DbSet OAuthTokens { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 配置User实体 modelBuilder.Entity(entity => { entity.HasIndex(e => e.Email).IsUnique(); entity.HasIndex(e => e.Username).IsUnique(); entity.Property(e => e.CreatedAt).HasDefaultValueSql("CURRENT_TIMESTAMP"); }); // 配置SentMail实体 modelBuilder.Entity(entity => { entity.HasOne(e => e.Sender) .WithMany(u => u.SentMails) .HasForeignKey(e => e.SenderId) .OnDelete(DeleteBehavior.Restrict); entity.HasOne() .WithMany() .HasForeignKey(e => e.RecipientId) .OnDelete(DeleteBehavior.SetNull); entity.Property(e => e.SentAt).HasDefaultValueSql("CURRENT_TIMESTAMP"); }); // 配置ReceivedMail实体 modelBuilder.Entity(entity => { entity.HasOne(e => e.SentMail) .WithMany() .HasForeignKey(e => e.SentMailId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne() .WithMany() .HasForeignKey(e => e.RecipientId) .OnDelete(DeleteBehavior.Cascade); entity.Property(e => e.ReceivedAt).HasDefaultValueSql("CURRENT_TIMESTAMP"); }); // 配置TimeCapsule实体 modelBuilder.Entity(entity => { entity.HasOne(e => e.User) .WithMany(u => u.TimeCapsules) .HasForeignKey(e => e.UserId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne() .WithMany() .HasForeignKey(e => e.SentMailId) .OnDelete(DeleteBehavior.Cascade); entity.Property(e => e.CreatedAt).HasDefaultValueSql("CURRENT_TIMESTAMP"); }); // 配置OAuthClient实体 modelBuilder.Entity(entity => { entity.HasIndex(e => e.ClientId).IsUnique(); entity.Property(e => e.CreatedAt).HasDefaultValueSql("CURRENT_TIMESTAMP"); entity.Property(e => e.UpdatedAt).HasDefaultValueSql("CURRENT_TIMESTAMP"); }); // 配置OAuthToken实体 modelBuilder.Entity(entity => { entity.HasOne(e => e.User) .WithMany() .HasForeignKey(e => e.UserId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(e => e.Client) .WithMany(c => c.Tokens) .HasForeignKey(e => e.ClientId) .OnDelete(DeleteBehavior.Cascade); entity.HasIndex(e => e.AccessToken).IsUnique(); entity.HasIndex(e => e.RefreshToken).IsUnique(); entity.Property(e => e.CreatedAt).HasDefaultValueSql("CURRENT_TIMESTAMP"); }); } } }