using Microsoft.EntityFrameworkCore; using ContactManagementAPI.Models; namespace ContactManagementAPI.Data { public class ApplicationDbContext : DbContext { public ApplicationDbContext(DbContextOptions options) : base(options) { } public DbSet Contacts { get; set; } public DbSet ContactGroups { get; set; } public DbSet ContactPhotos { get; set; } public DbSet ContactDocuments { get; set; } public DbSet ContactBankAccounts { get; set; } public DbSet AppUsers { get; set; } public DbSet UserGroups { get; set; } public DbSet GroupRights { get; set; } public DbSet UserRights { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // Contact - ContactGroup relationship modelBuilder.Entity() .HasOne(c => c.Group) .WithMany(g => g.Contacts) .HasForeignKey(c => c.GroupId) .OnDelete(DeleteBehavior.SetNull); // Contact - ContactPhoto relationship modelBuilder.Entity() .HasOne(cp => cp.Contact) .WithMany(c => c.Photos) .HasForeignKey(cp => cp.ContactId) .OnDelete(DeleteBehavior.Cascade); // Contact - ContactDocument relationship modelBuilder.Entity() .HasOne(cd => cd.Contact) .WithMany(c => c.Documents) .HasForeignKey(cd => cd.ContactId) .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity() .HasOne(cb => cb.Contact) .WithMany(c => c.BankAccounts) .HasForeignKey(cb => cb.ContactId) .OnDelete(DeleteBehavior.Cascade); // AppUser - UserGroup relationship modelBuilder.Entity() .HasOne(u => u.Group) .WithMany(g => g.Users) .HasForeignKey(u => u.GroupId) .OnDelete(DeleteBehavior.SetNull); // GroupRight - UserGroup relationship modelBuilder.Entity() .HasOne(gr => gr.UserGroup) .WithMany(g => g.GroupRights) .HasForeignKey(gr => gr.UserGroupId) .OnDelete(DeleteBehavior.Cascade); // UserRight - AppUser relationship modelBuilder.Entity() .HasOne(ur => ur.AppUser) .WithMany(u => u.UserRights) .HasForeignKey(ur => ur.AppUserId) .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity() .HasIndex(u => u.UserName) .IsUnique(); modelBuilder.Entity() .HasIndex(g => g.Name) .IsUnique(); modelBuilder.Entity() .HasIndex(gr => new { gr.UserGroupId, gr.RightKey }) .IsUnique(); modelBuilder.Entity() .HasIndex(ur => new { ur.AppUserId, ur.RightKey }) .IsUnique(); // Seed default contact groups modelBuilder.Entity().HasData( new ContactGroup { Id = 1, Name = "Family", Description = "Family members", CreatedAt = DateTime.Now }, new ContactGroup { Id = 2, Name = "Friends", Description = "Friends", CreatedAt = DateTime.Now }, new ContactGroup { Id = 3, Name = "Business", Description = "Business contacts", CreatedAt = DateTime.Now }, new ContactGroup { Id = 4, Name = "School", Description = "School contacts", CreatedAt = DateTime.Now }, new ContactGroup { Id = 5, Name = "Church", Description = "Church members", CreatedAt = DateTime.Now }, new ContactGroup { Id = 6, Name = "Others", Description = "Other contacts", CreatedAt = DateTime.Now }, new ContactGroup { Id = 7, Name = "College", Description = "College contacts", CreatedAt = DateTime.Now }, new ContactGroup { Id = 8, Name = "AA", Description = "Alcoholics Anonymous", CreatedAt = DateTime.Now } ); } } }