#nullable disable using AipGateway.API.Domain.Entities; using AipGateway.API.Domain.IServices.IUtilities; using AipGateway.API.Infrastructure.Configurations; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using System.Data; namespace AipGateway.API.Infrastructure.Persistence { public class ApplicationDbContext : DbContext { private readonly ILogger _log; private readonly IDomainEventDispatcher _dispatcher; private readonly ConnectionInfo _connectionInfo; public ApplicationDbContext(ILogger logger, DbContextOptions options, ConnectionInfo connectionInfo) : base(options) { _log = logger; _connectionInfo = connectionInfo; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(_connectionInfo.ConnectionString, b => b.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName)); } protected override void OnModelCreating(ModelBuilder builder) { #if false //ApplicationDbContextSeed.SeedSampleDataAsync(modelBuilder); ==> 테스트 데이터 넣을 경우 foreach (var entityType in builder.Model.GetEntityTypes()) { //get first property of entity with DatabaseGeneratedAttribute = DatabaseGeneratedOption.Identity var idProp = entityType.GetProperties() .FirstOrDefault(x => x.PropertyInfo != null && x.PropertyInfo.GetCustomAttribute() ?.DatabaseGeneratedOption == DatabaseGeneratedOption.Identity); //if it exists, set it to identity if (idProp != null) { builder.Entity(entityType.ClrType) .Property(idProp.Name) .ValueGeneratedOnAddOrUpdate() .UseIdentityColumn(); } } #endif } public override int SaveChanges() { //var userID = _currentUserService.ID; //if (userID == 0) //{ // return base.SaveChanges(); //} foreach (var entry in ChangeTracker.Entries()) { switch (entry.State) { case EntityState.Added: //entry.Entity.CreatedBy = userID; entry.Entity.CreatedAt = DateTime.UtcNow; entry.Entity.IsActive = true; entry.Entity.IsDeleted = false; break; case EntityState.Modified: //entry.Entity.ModifiedBy = userID; entry.Entity.ModifiedAt = DateTime.UtcNow; break; } } //foreach (var entry in ChangeTracker.Entries()) //{ // switch (entry.State) // { // case EntityState.Added: // entry.Entity.CreatedBy = userID; // entry.Entity.CreatedAt = DateTime.UtcNow; // break; // case EntityState.Modified: // entry.Entity.ModifiedBy = userID; // entry.Entity.ModifiedAt = DateTime.UtcNow; // break; // } //} //foreach (var entry in ChangeTracker.Entries()) //{ // switch (entry.State) // { // case EntityState.Added: // entry.Entity.CreatedBy = userID; // entry.Entity.CreatedAt = DateTime.UtcNow; // break; // case EntityState.Modified: // entry.Entity.ModifiedBy = userID; // entry.Entity.ModifiedAt = DateTime.UtcNow; // break; // } //} PreSaveChanges().GetAwaiter().GetResult(); var response = base.SaveChanges(); PostSaveChanges().GetAwaiter().GetResult(); return response; } private async Task PreSaveChanges() { await Task.CompletedTask; } private async Task PostSaveChanges() { await DispatchDomainEvents(); } private async Task DispatchDomainEvents() { var domainEventEntities = ChangeTracker.Entries() .Select(po => po.Entity) .Where(po => po.DomainEvents.Any()) .ToArray(); foreach (var entity in domainEventEntities) { while (entity.DomainEvents.TryTake(out IDomainEvent dev)) await _dispatcher.Dispatch(dev); } } public IEnumerable SqlQuery(FormattableString sql) { try { return Database.SqlQuery(sql); } catch (Exception ex) { _log.LogError("SqlQuery: {0}", sql.ToString()); _log.LogError("SqlQuery: {0}", ex.Message); } return null; } public int ExecuteSql(FormattableString sql) { try { return Database.ExecuteSql(sql); } catch (Exception ex) { _log.LogError("ExecuteSql: {0}", sql.ToString()); _log.LogError("ExecuteSql: {0}", ex.Message); } return -1; } public virtual DbSet LinkedSystems { get; set; } public virtual DbSet LinkedServers { get; set; } public virtual DbSet LinkedDecryptKeys { get; set; } public virtual DbSet LinkedApiKeys { get; set; } public virtual DbSet AipLabels { get; set; } public virtual DbSet AipPolicies { get; set; } public virtual DbSet AipProtections { get; set; } public virtual DbSet AipServers { get; set; } public virtual DbSet AipConfigs { get; set; } public virtual DbSet AipFileJobLogs { get; set; } public virtual DbSet AipApiCallLogs { get; set; } } }