diff --git a/DDDCommon.csproj b/DDDCommon.csproj index 7d6ebb8..01246d7 100644 --- a/DDDCommon.csproj +++ b/DDDCommon.csproj @@ -6,25 +6,23 @@ Meteor true latest - 1.2.5 + 1.2.6 + - + - - - - - - - + + + + diff --git a/Infrastructure/Types/EntityFramework/PostgreSqlDbContext.cs b/Infrastructure/Types/EntityFramework/PostgreSqlDbContext.cs deleted file mode 100644 index 8a1b2d2..0000000 --- a/Infrastructure/Types/EntityFramework/PostgreSqlDbContext.cs +++ /dev/null @@ -1,188 +0,0 @@ -using System; -using System.Text.RegularExpressions; -using System.Threading; -using System.Threading.Tasks; -using DDDCommon.Utils; -using MediatR; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Storage; -using Npgsql; -using Npgsql.NameTranslation; - -namespace DDDCommon.Infrastructure.Types.EntityFramework -{ - public class PostgreSqlDbContext : DbContext - { - private static readonly Regex KeysRegex = new Regex("^(PK|FK|IX)_", RegexOptions.Compiled); - private readonly EventBus _bus; - private readonly IMediator _mediator; - private readonly DbConfigurations _dbConfigurations; - - //[Obsolete] - //public static readonly LoggerFactory MyLoggerFactory - // = new LoggerFactory(new[] { new ConsoleLoggerProvider((category, level) - // => category == DbLoggerCategory.Database.Command.Name, true) }); - - public PostgreSqlDbContext(DbContextOptions options, - EventBus bus, IMediator mediator, DbConfigurations dbConfigurations) - : base(options) - { - _bus = bus; - _mediator = mediator; - _dbConfigurations = dbConfigurations; - } - - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - => optionsBuilder - //.UseLoggerFactory(MyLoggerFactory) - .EnableSensitiveDataLogging() - .UseNpgsql(_dbConfigurations.ConnectionString, o => - { - if (_dbConfigurations.UseNodaTime) - o.UseNodaTime(); - - if (_dbConfigurations.UseNetTopologySuite) - o.UseNetTopologySuite(); - }); - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - modelBuilder - .ForNpgsqlUseIdentityByDefaultColumns() - .HasPostgresExtension("citext"); - - if (_dbConfigurations.UseNetTopologySuite) - modelBuilder.HasPostgresExtension("postgis"); - - _dbConfigurations.EntityTypeAssemblies.ForEach(x => modelBuilder.ApplyConfigurationsFromAssembly(x)); - - FixSnakeCaseNames(modelBuilder); - - Console.WriteLine("\n\nOn Model Creating!\n\n"); - } - - public void EnsureCreated() - { - Database.EnsureCreated(); - if (!(Database.GetService() is RelationalDatabaseCreator databaseCreator)) - return; - var schemas = $"'{string.Join("', '", _dbConfigurations.Schemas)}'"; - var sql = "SELECT count(*) FROM information_schema.tables " + - $"WHERE table_schema IN ({schemas}) AND table_type = 'BASE TABLE' AND table_name NOT IN('__EFMigrationsHistory', 'spatial_ref_sys');"; - Database.OpenConnection(); - using (var cmd = Database.GetDbConnection().CreateCommand()) - { - cmd.CommandText = sql; - if (Convert.ToInt64(cmd.ExecuteScalar()) == 0) - databaseCreator.CreateTables(); - } - } - - public override async Task SaveChangesAsync(CancellationToken cancellationToken = default) - { - - while (_bus.Count > 0) - { - var @event = _bus.DequeueEvent(); - await _mediator.Publish(@event, cancellationToken); - } - try - { - return await base.SaveChangesAsync(cancellationToken); - } - catch (DbUpdateException e) - { - if (!(e.InnerException is PostgresException pgError)) - throw Errors.InternalError(e.InnerException != null - ? e.InnerException.Message - : e.Message); - - switch (pgError.SqlState) - { - case "23505": - throw Errors.DuplicateKey(pgError.Detail); - default: - throw Errors.DatabaseError(pgError.Detail); - } - } - catch (Exception e) - { - throw Errors.InternalError(e.InnerException != null - ? e.InnerException.Message - : e.Message); - } - } - - private void FixSnakeCaseNames(ModelBuilder modelBuilder) - { - var mapper = new NpgsqlSnakeCaseNameTranslator(); - foreach (var table in modelBuilder.Model.GetEntityTypes()) - { - ConvertToSnake(mapper, table); - foreach (var property in table.GetProperties()) - { - ConvertToSnake(mapper, property); - } - - foreach (var primaryKey in table.GetKeys()) - { - ConvertToSnake(mapper, primaryKey); - } - - foreach (var foreignKey in table.GetForeignKeys()) - { - ConvertToSnake(mapper, foreignKey); - } - - foreach (var indexKey in table.GetIndexes()) - { - ConvertToSnake(mapper, indexKey); - } - } - } - - private void ConvertToSnake(INpgsqlNameTranslator mapper, object entity) - { - switch (entity) - { - case IMutableEntityType table: - var relationalTable = table.Relational(); - relationalTable.TableName = ConvertGeneralToSnake(mapper, relationalTable.TableName); - if (relationalTable.TableName.StartsWith("asp_net_")) - { - relationalTable.TableName = relationalTable.TableName.Replace("asp_net_", string.Empty); - relationalTable.Schema = "identity"; - } - - break; - case IMutableProperty property: - property.Relational().ColumnName = ConvertGeneralToSnake(mapper, property.Relational().ColumnName); - break; - case IMutableKey primaryKey: - primaryKey.Relational().Name = ConvertKeyToSnake(mapper, primaryKey.Relational().Name); - break; - case IMutableForeignKey foreignKey: - foreignKey.Relational().Name = ConvertKeyToSnake(mapper, foreignKey.Relational().Name); - break; - case IMutableIndex indexKey: - indexKey.Relational().Name = ConvertKeyToSnake(mapper, indexKey.Relational().Name); - break; - default: - throw new NotImplementedException("Unexpected type was provided to snake case converter"); - } - } - - private string ConvertKeyToSnake(INpgsqlNameTranslator mapper, string keyName) => - ConvertGeneralToSnake(mapper, KeysRegex.Replace(keyName, - match => match.Value.ToLower())); - - private string ConvertGeneralToSnake(INpgsqlNameTranslator mapper, string entityName) => - mapper.TranslateMemberName(ModifyNameBeforeConversion(mapper, entityName)); - - protected virtual string ModifyNameBeforeConversion(INpgsqlNameTranslator mapper, string entityName) => - entityName; - - } -} diff --git a/Infrastructure/Types/Repository.cs b/Infrastructure/Types/Repository.cs index 96c6649..06f6654 100644 --- a/Infrastructure/Types/Repository.cs +++ b/Infrastructure/Types/Repository.cs @@ -8,7 +8,6 @@ using System.Text; using System.Threading; using System.Threading.Tasks; -using DDDCommon.Infrastructure.Types.EntityFramework; using NHibernate; using NHibernate.Linq; using Remotion.Linq.Clauses.ResultOperators;