using DCGEngine.Database.Configuration; using DCGEngine.Database.Interfaces; using DCGEngine.Database.Models; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; namespace DCGEngine.Database; public class DCGEDbContext : DbContext { private readonly DCGEDatabaseConfiguration _configuration; private readonly ILogger _logger; public DCGEDbContext(IOptions configuration, ILogger logger, DbContextOptions options) : base(options) { _logger = logger; _configuration = configuration.Value; } /// public override async Task SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken()) { foreach (var entityEntry in ChangeTracker.Entries()) { if (entityEntry.Entity is ITimeTrackedEntity timeTrackedEntity) { if (entityEntry.State is EntityState.Added && timeTrackedEntity.DateCreated is null) { timeTrackedEntity.DateCreated = DateTime.UtcNow; } if (entityEntry.State is EntityState.Modified or EntityState.Added) { timeTrackedEntity.DateUpdated = DateTime.UtcNow; } } } return await base.SaveChangesAsync(cancellationToken); } /// protected override void OnModelCreating(ModelBuilder modelBuilder) { _configuration.DbSetSearchAssemblies.ForEach(assembly => { foreach (var typeInfo in assembly.DefinedTypes.Where(type => type.IsAssignableTo(typeof(IDbTrackedEntity)))) { modelBuilder.Entity(typeInfo.AsType()); } }); base.OnModelCreating(modelBuilder); } public void UpdateDatabase() { IEnumerable pendingMigrations = Database.GetPendingMigrations(); if (!pendingMigrations.Any()) { return; } foreach (string migration in pendingMigrations) { _logger.LogInformation("Found pending migration with name {migrationName}.", migration); } _logger.LogInformation("Attempting to apply pending migrations..."); Database.Migrate(); _logger.LogInformation("Migrations applied."); } }