using System; using API.Entities; using API.Entities.Interfaces; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; namespace API.Data { public sealed class DataContext : IdentityDbContext, AppUserRole, IdentityUserLogin, IdentityRoleClaim, IdentityUserToken> { public DataContext(DbContextOptions options) : base(options) { ChangeTracker.Tracked += OnEntityTracked; ChangeTracker.StateChanged += OnEntityStateChanged; } public DbSet Library { get; set; } public DbSet Series { get; set; } public DbSet Volume { get; set; } public DbSet AppUser { get; set; } public DbSet AppUserProgresses { get; set; } public DbSet AppUserRating { get; set; } protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); builder.Entity() .HasMany(ur => ur.UserRoles) .WithOne(u => u.User) .HasForeignKey(ur => ur.UserId) .IsRequired(); builder.Entity() .HasMany(ur => ur.UserRoles) .WithOne(u => u.Role) .HasForeignKey(ur => ur.RoleId) .IsRequired(); } void OnEntityTracked(object sender, EntityTrackedEventArgs e) { if (!e.FromQuery && e.Entry.State == EntityState.Added && e.Entry.Entity is IEntityDate entity) entity.Created = DateTime.Now; } void OnEntityStateChanged(object sender, EntityStateChangedEventArgs e) { if (e.NewState == EntityState.Modified && e.Entry.Entity is IEntityDate entity) entity.LastModified = DateTime.Now; } } }