// https://github.com/abpframework/abp/blob/b390e3cc7b79a6216c1787f5f7bc598aae35eb14/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DbNamingConventionRewriterExtensions.cs

        public static void NamingConventionsRewriteName(this DbContextOptionsBuilder optionsBuilder,
                                                        DbNamingConvention namingConvention = DbNamingConvention.Default,
                                                        CultureInfo culture = null)
        {
            switch (namingConvention)
            {
            case DbNamingConvention.Default:
                break;

            case DbNamingConvention.SnakeCase:
                optionsBuilder.UseSnakeCaseNamingConvention(culture);
                break;

            case DbNamingConvention.LowerCase:
                optionsBuilder.UseLowerCaseNamingConvention(culture);
                break;

            case DbNamingConvention.UpperCase:
                optionsBuilder.UseUpperCaseNamingConvention(culture);
                break;

            case DbNamingConvention.UpperSnakeCase:
                optionsBuilder.UseUpperSnakeCaseNamingConvention(culture);
                break;

            case DbNamingConvention.CamelCase:
                optionsBuilder.UseCamelCaseNamingConvention(culture);
                break;

            default:
                break;
            }
        }
        public static void NamingConventionsRewriteName(this ModelBuilder modelBuilder,
                                                        DbNamingConvention namingConvention = DbNamingConvention.Default,
                                                        CultureInfo culture = null)
        {
            if (namingConvention == DbNamingConvention.Default)
            {
                return;
            }

            INameRewriter nameRewriter = null;

            culture ??= CultureInfo.InvariantCulture;
            switch (namingConvention)
            {
            case DbNamingConvention.Default:
                break;

            case DbNamingConvention.SnakeCase:
                nameRewriter = new SnakeCaseNameRewriter(culture);
                break;

            case DbNamingConvention.LowerCase:
                nameRewriter = new LowerCaseNameRewriter(culture);
                break;

            case DbNamingConvention.UpperCase:
                nameRewriter = new UpperCaseNameRewriter(culture);
                break;

            case DbNamingConvention.UpperSnakeCase:
                nameRewriter = new UpperSnakeCaseNameRewriter(culture);
                break;

            case DbNamingConvention.CamelCase:
                nameRewriter = new CamelCaseNameRewriter(culture);
                break;

            default:
                break;
            }

            foreach (var entity in modelBuilder.Model.GetEntityTypes())
            {
                entity.SetTableName(nameRewriter.RewriteName(entity.GetTableName()));

                foreach (var property in entity.GetProperties())
                {
                    // property.SetColumnName(nameRewriter.RewriteName(property.GetColumnName()));
                    var columnName = property.GetColumnName(StoreObjectIdentifier.Table(entity.GetTableName(), null));
                    property.SetColumnName(nameRewriter.RewriteName(columnName));
                }

                foreach (var key in entity.GetKeys())
                {
                    key.SetName(nameRewriter.RewriteName(key.GetName()));
                }

                foreach (var key in entity.GetForeignKeys())
                {
                    key.SetConstraintName(nameRewriter.RewriteName(key.GetConstraintName()));
                }

                foreach (var index in entity.GetIndexes())
                {
                    // index.SetName(nameRewriter.RewriteName(index.GetName());
                    index.SetDatabaseName(nameRewriter.RewriteName(index.GetDatabaseName()));
                }
            }
        }