public virtual string Create(bool ifNotExists)
        {
            var builder = new IndentedStringBuilder();

            if (ifNotExists)
            {
                builder.AppendLine("IF NOT EXISTS(SELECT * FROM [INFORMATION_SCHEMA].[TABLES] WHERE[TABLE_SCHEMA] = N'dbo' AND[TABLE_NAME] = '" + MigrationHistoryTableName + "' AND[TABLE_TYPE] = 'BASE TABLE')");
                builder.IncrementIndent();
            }

            builder
                .AppendLine("CREATE TABLE [dbo].[" + MigrationHistoryTableName + "] (");
            using (builder.Indent())
            {
                builder
                    .AppendLine("[MigrationId] nvarchar(150) NOT NULL,")
                    .AppendLine("[ContextKey] nvarchar(300) NOT NULL,")
                    .AppendLine("[ProductVersion] nvarchar(32) NOT NULL,")
                    .AppendLine("CONSTRAINT [PK_MigrationHistory] PRIMARY KEY ([MigrationId], [ContextKey])");
            }
            builder.Append(");");

            return builder.ToString();
        }
            public Indenter(IndentedStringBuilder stringBuilder)
            {
                _stringBuilder = stringBuilder;

                _stringBuilder.IncrementIndent();
            }
            public Indenter(IndentedStringBuilder stringBuilder)
            {
                _stringBuilder = stringBuilder;

                _stringBuilder.IncrementIndent();
            }
        public virtual void GenerateOnModelCreatingCode([NotNull] IndentedStringBuilder sb)
        {
            Check.NotNull(sb, nameof(sb));

            Generator.CSharpCodeGeneratorHelper.BeginMethod(AccessModifier.Protected,
                VirtualModifier.Override, "void", "OnModelCreating", sb, _onModelCreatingMethodParameters);

            var first = true;
            foreach (var entityType in OrderedEntityTypes())
            {
                if (first)
                {
                    first = false;
                }
                else
                {
                    sb.AppendLine();
                }
                sb.Append("modelBuilder.Entity<");
                sb.Append(entityType.Name);
                sb.AppendLine(">(entity =>");
                GenerateEntityKeyAndPropertyConfiguration(entityType, sb);
                sb.AppendLine(");");
            }

            foreach (var entityType in OrderedEntityTypes())
            {
                var navigationsStringBuilder = new IndentedStringBuilder(sb);
                navigationsStringBuilder.IncrementIndent();
                GenerateNavigationsConfiguration(entityType, navigationsStringBuilder);
                var navigationsCode = navigationsStringBuilder.ToString();
                if (!string.IsNullOrEmpty(navigationsCode))
                {
                    sb.AppendLine();
                    sb.Append("modelBuilder.Entity<");
                    sb.Append(entityType.Name);
                    sb.AppendLine(">(entity =>");
                    sb.AppendLine("{");
                    sb.DecrementIndent().DecrementIndent().DecrementIndent();
                    sb.AppendLine(navigationsCode);
                    sb.IncrementIndent().IncrementIndent().IncrementIndent();
                    sb.AppendLine("});");
                }
            }

            Generator.CSharpCodeGeneratorHelper.EndMethod(sb);
        }