using Microsoft.EntityFrameworkCore; using MotoresArgentinosV2.Core.Entities; namespace MotoresArgentinosV2.Infrastructure.Data; public class MotoresV2DbContext : DbContext { public MotoresV2DbContext(DbContextOptions options) : base(options) { } public DbSet Users { get; set; } public DbSet Ads { get; set; } public DbSet AdPhotos { get; set; } public DbSet AdFeatures { get; set; } public DbSet Brands { get; set; } public DbSet Models { get; set; } public DbSet Transactions { get; set; } public DbSet Favorites { get; set; } public DbSet ChatMessages { get; set; } public DbSet AuditLogs { get; set; } public DbSet PaymentMethods { get; set; } public DbSet RefreshTokens { get; set; } public DbSet AdViewLogs { get; set; } public DbSet NotificationPreferences { get; set; } public DbSet UnsubscribeTokens { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity().HasKey(p => p.PaymentMethodID); modelBuilder.Entity().HasKey(m => m.MessageID); modelBuilder.Entity().ToTable("ChatMessages"); // Configuración de Cascada para Mensajes modelBuilder.Entity() .HasOne(m => m.Ad) .WithMany(a => a.Messages) .HasForeignKey(m => m.AdID) .OnDelete(DeleteBehavior.Cascade); // Esto asegura que EF intente borrar los mensajes // Configuración de Favorites (Clave compuesta) modelBuilder.Entity() .HasKey(f => new { f.UserID, f.AdID }); // Nombres de tablas exactos modelBuilder.Entity().ToTable("Favorites"); // Configuración de AdFeatures (Clave compuesta) modelBuilder.Entity() .HasKey(af => new { af.AdID, af.FeatureKey }); // Configuración de Identificadores (Claves Primarias) modelBuilder.Entity().HasKey(p => p.PhotoID); modelBuilder.Entity().HasKey(b => b.BrandID); modelBuilder.Entity().HasKey(m => m.ModelID); modelBuilder.Entity().HasKey(u => u.UserID); modelBuilder.Entity().HasKey(a => a.AdID); modelBuilder.Entity().HasKey(t => t.TransactionID); modelBuilder.Entity().Property(a => a.Price).HasColumnType("decimal(18,2)"); modelBuilder.Entity().Property(t => t.Amount).HasColumnType("decimal(18,2)"); // Nombres de tablas exactos para coincidir con el Roadmap modelBuilder.Entity().ToTable("Users"); modelBuilder.Entity().ToTable("Ads"); modelBuilder.Entity().ToTable("AdPhotos"); modelBuilder.Entity().ToTable("AdFeatures"); modelBuilder.Entity().ToTable("Transactions"); modelBuilder.Entity().ToTable("AdViewLogs"); modelBuilder.Entity().HasIndex(l => new { l.AdID, l.IPAddress, l.ViewDate }); // Configuración de UserNotificationPreference modelBuilder.Entity().ToTable("UserNotificationPreferences"); modelBuilder.Entity().HasKey(p => p.PreferenceID); // Índice único: un usuario no puede tener dos registros para la misma categoría modelBuilder.Entity() .HasIndex(p => new { p.UserID, p.Category }) .IsUnique(); modelBuilder.Entity() .HasOne(p => p.User) .WithMany() .HasForeignKey(p => p.UserID) .OnDelete(DeleteBehavior.Cascade); // Configuración de UnsubscribeToken modelBuilder.Entity().ToTable("UnsubscribeTokens"); modelBuilder.Entity().HasKey(t => t.TokenID); // Índice para búsqueda rápida por valor del token modelBuilder.Entity().HasIndex(t => t.Token).IsUnique(); modelBuilder.Entity() .HasOne(t => t.User) .WithMany() .HasForeignKey(t => t.UserID) .OnDelete(DeleteBehavior.Cascade); } }