Loading src/infrastructure/Contexts/ApplicationDbContext.cs +44 −0 Original line number Diff line number Diff line using Cals.Visor.Models; using Cals.Visor.Models.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Metadata; namespace Cals.Visor.Infrastructure.Contexts; Loading Loading @@ -32,6 +34,22 @@ public class ApplicationDbContext : DbContext protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.ApplyConfigurationsFromAssembly(typeof(ApplicationDbContext).Assembly); foreach (IMutableEntityType entityType in modelBuilder.Model.GetEntityTypes()) { // mark this to have the value generated on add (in the database) if (typeof(ICreatedAt).IsAssignableFrom(entityType.ClrType)) { modelBuilder.Entity(entityType.ClrType).Property(nameof(ICreatedAt.CreatedAt)) .ValueGeneratedOnAddOrUpdate(); } if (typeof(IUpdatedAt).IsAssignableFrom(entityType.ClrType)) { modelBuilder.Entity(entityType.ClrType).Property(nameof(IUpdatedAt.UpdatedAt)) .ValueGeneratedOnAdd(); } } } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) Loading @@ -39,4 +57,30 @@ public class ApplicationDbContext : DbContext optionsBuilder .UseSnakeCaseNamingConvention(); } public override int SaveChanges(bool acceptAllChangesOnSuccess) { UpdateTimestamps(); return base.SaveChanges(acceptAllChangesOnSuccess); } public override async Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default) { UpdateTimestamps(); return await base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken); } /// <summary> /// Updates all UpdatedAt with UTCNow /// </summary> private void UpdateTimestamps() { IEnumerable<EntityEntry<IUpdatedAt>> entries = ChangeTracker.Entries<IUpdatedAt>() .Where(e => e.State == EntityState.Added || e.State == EntityState.Modified); foreach (EntityEntry<IUpdatedAt> entry in entries) { entry.Entity.UpdatedAt = DateTime.UtcNow; } } } src/infrastructure/Database/ColumnNames.cs +1 −1 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ internal sealed class ColumnNames internal const string AccessDomainId = "pa_access_domain_id"; internal const string FirewallVlanId = "pa_firewall_vlan_id"; internal const string AccessDomainFirewallId = "pa_access_domains_pa_firewalls_id"; internal const string AccessDomainVsysId = "pa_access_domain_id"; internal const string AccessDomainVsysId = "pa_access_domains_pa_vsyses_id"; } internal sealed class Infoblox Loading src/infrastructure/Models/LocationEntityTypeConfiguration.cs +7 −5 Original line number Diff line number Diff line Loading @@ -27,13 +27,12 @@ public class LocationEntityTypeConfiguration : IEntityTypeConfiguration<Location .HasMany(l => l.Vlans) .WithMany() // You can add .WithMany(v => v.Locations) if you add a Locations collection to Vlan .UsingEntity<LocationVlan>( TableNames.LocationVlans, j => j .HasOne<Vlan>() .HasOne(e => e.Vlan) .WithMany() .HasForeignKey(e => e.VlanId), j => j .HasOne<Location>() .HasOne(e => e.Location) .WithMany() .HasForeignKey(e => e.LocationId), j => Loading @@ -42,10 +41,13 @@ public class LocationEntityTypeConfiguration : IEntityTypeConfiguration<Location j.HasKey(e => e.LocationVlanId); j.Property(e => e.Vlan) j.Property(e => e.LocationVlanId) .HasColumnName(ColumnNames.LocationVlanId); j.Property(e => e.VlanId) .HasColumnName(ColumnNames.VlanId); j.Property(e => e.Location) j.Property(e => e.LocationId) .HasColumnName(ColumnNames.LocationId); } ); Loading src/infrastructure/Models/PaloAltoAccessDomainEntityTypeConfiguration.cs +8 −11 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ public class PaloAltoAccessDomainEntityTypeConfiguration : IEntityTypeConfigurat builder.HasKey(e => e.AccessDomainId); builder.Property(e => e.AccessDomainId) .HasColumnName(ColumnNames.PaloAlto.AccessDomainId)); .HasColumnName(ColumnNames.PaloAlto.AccessDomainId); builder.Property(e => e.Name) .HasMaxLength(100); Loading @@ -28,20 +28,19 @@ public class PaloAltoAccessDomainEntityTypeConfiguration : IEntityTypeConfigurat builder.HasMany(e => e.Vsyses) .WithMany() .UsingEntity<PaloAltoAccessDomainVsys>( TableNames.PaloAltoAccessDomainsToVsyses, j => j .HasOne<PaloAltoVsys>() .HasOne(e => e.Vsys) .WithMany() .HasForeignKey(e => e.VsysId), j => j .HasOne<PaloAltoAccessDomain>() .HasOne(e => e.AccessDomain) .WithMany() .HasForeignKey(e => e.AccessDomainId), j => { j.ToTable(TableNames.PaloAltoAccessDomainsToVsyses); j.HasKey(ColumnNames.PaloAlto.AccessDomainVsysId); j.HasKey(e => e.AccessDomainVsysId); j.Property(e => e.AccessDomainVsysId) .HasColumnName(ColumnNames.PaloAlto.AccessDomainVsysId); Loading @@ -57,20 +56,19 @@ public class PaloAltoAccessDomainEntityTypeConfiguration : IEntityTypeConfigurat builder.HasMany(e => e.Firewalls) .WithMany() .UsingEntity<PaloAltoAccessDomainFirewall>( TableNames.PaloAltoAccessDomainsToFirewalls, j => j .HasOne<PaloAltoFirewall>() .HasOne(e => e.Firewall) .WithMany() .HasForeignKey(e => e.FirewallId), j => j .HasOne<PaloAltoAccessDomain>() .HasOne(e => e.AccessDomain) .WithMany() .HasForeignKey(e => e.AccessDomainId), j => { j.ToTable(TableNames.PaloAltoAccessDomainsToVsyses); j.ToTable(TableNames.PaloAltoAccessDomainsToFirewalls); j.HasKey(ColumnNames.PaloAlto.AccessDomainFirewallId); j.HasKey(e => e.AccessDomainFirewallId); j.Property(e => e.AccessDomainFirewallId) .HasColumnName(ColumnNames.PaloAlto.AccessDomainFirewallId); Loading @@ -78,7 +76,6 @@ public class PaloAltoAccessDomainEntityTypeConfiguration : IEntityTypeConfigurat j.Property(e => e.FirewallId) .HasColumnName(ColumnNames.PaloAlto.FirewallId); j.Property(e => e.AccessDomainId) .HasColumnName(ColumnNames.PaloAlto.AccessDomainId); } Loading src/models/ICreatedAt.cs 0 → 100644 +7 −0 Original line number Diff line number Diff line namespace Cals.Visor.Models; public interface ICreatedAt { DateTime? CreatedAt { get; set; } } Loading
src/infrastructure/Contexts/ApplicationDbContext.cs +44 −0 Original line number Diff line number Diff line using Cals.Visor.Models; using Cals.Visor.Models.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Metadata; namespace Cals.Visor.Infrastructure.Contexts; Loading Loading @@ -32,6 +34,22 @@ public class ApplicationDbContext : DbContext protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.ApplyConfigurationsFromAssembly(typeof(ApplicationDbContext).Assembly); foreach (IMutableEntityType entityType in modelBuilder.Model.GetEntityTypes()) { // mark this to have the value generated on add (in the database) if (typeof(ICreatedAt).IsAssignableFrom(entityType.ClrType)) { modelBuilder.Entity(entityType.ClrType).Property(nameof(ICreatedAt.CreatedAt)) .ValueGeneratedOnAddOrUpdate(); } if (typeof(IUpdatedAt).IsAssignableFrom(entityType.ClrType)) { modelBuilder.Entity(entityType.ClrType).Property(nameof(IUpdatedAt.UpdatedAt)) .ValueGeneratedOnAdd(); } } } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) Loading @@ -39,4 +57,30 @@ public class ApplicationDbContext : DbContext optionsBuilder .UseSnakeCaseNamingConvention(); } public override int SaveChanges(bool acceptAllChangesOnSuccess) { UpdateTimestamps(); return base.SaveChanges(acceptAllChangesOnSuccess); } public override async Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default) { UpdateTimestamps(); return await base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken); } /// <summary> /// Updates all UpdatedAt with UTCNow /// </summary> private void UpdateTimestamps() { IEnumerable<EntityEntry<IUpdatedAt>> entries = ChangeTracker.Entries<IUpdatedAt>() .Where(e => e.State == EntityState.Added || e.State == EntityState.Modified); foreach (EntityEntry<IUpdatedAt> entry in entries) { entry.Entity.UpdatedAt = DateTime.UtcNow; } } }
src/infrastructure/Database/ColumnNames.cs +1 −1 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ internal sealed class ColumnNames internal const string AccessDomainId = "pa_access_domain_id"; internal const string FirewallVlanId = "pa_firewall_vlan_id"; internal const string AccessDomainFirewallId = "pa_access_domains_pa_firewalls_id"; internal const string AccessDomainVsysId = "pa_access_domain_id"; internal const string AccessDomainVsysId = "pa_access_domains_pa_vsyses_id"; } internal sealed class Infoblox Loading
src/infrastructure/Models/LocationEntityTypeConfiguration.cs +7 −5 Original line number Diff line number Diff line Loading @@ -27,13 +27,12 @@ public class LocationEntityTypeConfiguration : IEntityTypeConfiguration<Location .HasMany(l => l.Vlans) .WithMany() // You can add .WithMany(v => v.Locations) if you add a Locations collection to Vlan .UsingEntity<LocationVlan>( TableNames.LocationVlans, j => j .HasOne<Vlan>() .HasOne(e => e.Vlan) .WithMany() .HasForeignKey(e => e.VlanId), j => j .HasOne<Location>() .HasOne(e => e.Location) .WithMany() .HasForeignKey(e => e.LocationId), j => Loading @@ -42,10 +41,13 @@ public class LocationEntityTypeConfiguration : IEntityTypeConfiguration<Location j.HasKey(e => e.LocationVlanId); j.Property(e => e.Vlan) j.Property(e => e.LocationVlanId) .HasColumnName(ColumnNames.LocationVlanId); j.Property(e => e.VlanId) .HasColumnName(ColumnNames.VlanId); j.Property(e => e.Location) j.Property(e => e.LocationId) .HasColumnName(ColumnNames.LocationId); } ); Loading
src/infrastructure/Models/PaloAltoAccessDomainEntityTypeConfiguration.cs +8 −11 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ public class PaloAltoAccessDomainEntityTypeConfiguration : IEntityTypeConfigurat builder.HasKey(e => e.AccessDomainId); builder.Property(e => e.AccessDomainId) .HasColumnName(ColumnNames.PaloAlto.AccessDomainId)); .HasColumnName(ColumnNames.PaloAlto.AccessDomainId); builder.Property(e => e.Name) .HasMaxLength(100); Loading @@ -28,20 +28,19 @@ public class PaloAltoAccessDomainEntityTypeConfiguration : IEntityTypeConfigurat builder.HasMany(e => e.Vsyses) .WithMany() .UsingEntity<PaloAltoAccessDomainVsys>( TableNames.PaloAltoAccessDomainsToVsyses, j => j .HasOne<PaloAltoVsys>() .HasOne(e => e.Vsys) .WithMany() .HasForeignKey(e => e.VsysId), j => j .HasOne<PaloAltoAccessDomain>() .HasOne(e => e.AccessDomain) .WithMany() .HasForeignKey(e => e.AccessDomainId), j => { j.ToTable(TableNames.PaloAltoAccessDomainsToVsyses); j.HasKey(ColumnNames.PaloAlto.AccessDomainVsysId); j.HasKey(e => e.AccessDomainVsysId); j.Property(e => e.AccessDomainVsysId) .HasColumnName(ColumnNames.PaloAlto.AccessDomainVsysId); Loading @@ -57,20 +56,19 @@ public class PaloAltoAccessDomainEntityTypeConfiguration : IEntityTypeConfigurat builder.HasMany(e => e.Firewalls) .WithMany() .UsingEntity<PaloAltoAccessDomainFirewall>( TableNames.PaloAltoAccessDomainsToFirewalls, j => j .HasOne<PaloAltoFirewall>() .HasOne(e => e.Firewall) .WithMany() .HasForeignKey(e => e.FirewallId), j => j .HasOne<PaloAltoAccessDomain>() .HasOne(e => e.AccessDomain) .WithMany() .HasForeignKey(e => e.AccessDomainId), j => { j.ToTable(TableNames.PaloAltoAccessDomainsToVsyses); j.ToTable(TableNames.PaloAltoAccessDomainsToFirewalls); j.HasKey(ColumnNames.PaloAlto.AccessDomainFirewallId); j.HasKey(e => e.AccessDomainFirewallId); j.Property(e => e.AccessDomainFirewallId) .HasColumnName(ColumnNames.PaloAlto.AccessDomainFirewallId); Loading @@ -78,7 +76,6 @@ public class PaloAltoAccessDomainEntityTypeConfiguration : IEntityTypeConfigurat j.Property(e => e.FirewallId) .HasColumnName(ColumnNames.PaloAlto.FirewallId); j.Property(e => e.AccessDomainId) .HasColumnName(ColumnNames.PaloAlto.AccessDomainId); } Loading
src/models/ICreatedAt.cs 0 → 100644 +7 −0 Original line number Diff line number Diff line namespace Cals.Visor.Models; public interface ICreatedAt { DateTime? CreatedAt { get; set; } }