public override string Generate( string migrationNamespace, string migrationName, IReadOnlyList<MigrationOperation> upOperations, IReadOnlyList<MigrationOperation> downOperations) { Check.NotEmpty(migrationNamespace, nameof(migrationNamespace)); Check.NotEmpty(migrationName, nameof(migrationName)); Check.NotNull(upOperations, nameof(upOperations)); Check.NotNull(downOperations, nameof(downOperations)); var builder = new IndentedStringBuilder(); builder .AppendLine("using System.Collections.Generic;") .AppendLine("using Microsoft.Data.Entity.Relational.Migrations;") .AppendLine("using Microsoft.Data.Entity.Relational.Migrations.Builders;") .AppendLine("using Microsoft.Data.Entity.Relational.Migrations.Operations;") .AppendLine() .Append("namespace ").AppendLine(migrationNamespace) .AppendLine("{"); using (builder.Indent()) { builder .Append("public partial class ").Append(_code.Identifier(migrationName)).AppendLine(" : Migration") .AppendLine("{"); using (builder.Indent()) { builder .AppendLine("public override void Up(MigrationBuilder migration)") .AppendLine("{"); using (builder.Indent()) { _operationGenerator.Generate("migration", upOperations, builder); } builder .AppendLine("}") .AppendLine() .AppendLine("public override void Down(MigrationBuilder migration)") .AppendLine("{"); using (builder.Indent()) { _operationGenerator.Generate("migration", downOperations, builder); } builder.AppendLine("}"); } builder.AppendLine("}"); } builder.AppendLine("}"); return builder.ToString(); }
public void Append_line_at_start_with_indent() { var indentedStringBuilder = new IndentedStringBuilder(); using (indentedStringBuilder.Indent()) { indentedStringBuilder.AppendLine("Foo"); } Assert.Equal(" Foo\r\n", indentedStringBuilder.ToString()); }
public void Append_line_in_middle_when_no_new_line() { var indentedStringBuilder = new IndentedStringBuilder(); indentedStringBuilder.AppendLine("Foo"); using (indentedStringBuilder.Indent()) { indentedStringBuilder.AppendLine("Foo"); } Assert.Equal("Foo\r\n Foo\r\n", indentedStringBuilder.ToString()); }
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 virtual string ScriptMigrations( string fromMigrationName, string toMigrationName, bool idempotent = false) { var migrations = _migrationAssembly.Migrations; if (string.IsNullOrEmpty(fromMigrationName)) { fromMigrationName = InitialDatabase; } else if (fromMigrationName != InitialDatabase) { fromMigrationName = _idGenerator.ResolveId(fromMigrationName, migrations); } if (string.IsNullOrEmpty(toMigrationName)) { toMigrationName = migrations.Last().Id; } else if (toMigrationName != InitialDatabase) { toMigrationName = _idGenerator.ResolveId(toMigrationName, migrations); } var builder = new IndentedStringBuilder(); // If going up... if (string.Compare(fromMigrationName, toMigrationName, StringComparison.OrdinalIgnoreCase) <= 0) { var migrationsToApply = migrations.Where( m => string.Compare(m.Id, fromMigrationName, StringComparison.OrdinalIgnoreCase) > 0 && string.Compare(m.Id, toMigrationName, StringComparison.OrdinalIgnoreCase) <= 0); var checkFirst = true; foreach (var migration in migrationsToApply) { if (checkFirst) { if (migration == migrations[0]) { builder.AppendLine(_historyRepository.Create(ifNotExists: true)); builder.AppendLine(_sqlGenerator.BatchSeparator); builder.AppendLine(); } checkFirst = false; } _logger.Value.LogVerbose(Strings.GeneratingUp(migration.Id)); foreach (var batch in ApplyMigration(migration)) { if (idempotent) { builder.AppendLine(_historyRepository.BeginIfNotExists(migration.Id)); using (builder.Indent()) { var lines = batch.Sql.Split(new[] { Environment.NewLine }, StringSplitOptions.None); foreach (var line in lines) { builder.AppendLine(line); } } builder.AppendLine(_historyRepository.EndIf()); } else { builder.Append(batch.Sql); } builder.AppendLine(_sqlGenerator.BatchSeparator); builder.AppendLine(); } } } else // If going down... { var migrationsToRevert = migrations .Where( m => string.Compare(m.Id, toMigrationName, StringComparison.OrdinalIgnoreCase) > 0 && string.Compare(m.Id, fromMigrationName, StringComparison.OrdinalIgnoreCase) <= 0) .OrderByDescending(m => m.Id); foreach (var migration in migrationsToRevert) { _logger.Value.LogVerbose(Strings.GeneratingDown(migration.Id)); foreach (var batch in RevertMigration(migration)) { if (idempotent) { builder.AppendLine(_historyRepository.BeginIfExists(migration.Id)); using (builder.Indent()) { var lines = batch.Sql.Split(new[] { Environment.NewLine }, StringSplitOptions.None); foreach (var line in lines) { builder.AppendLine(line); } } builder.AppendLine(_historyRepository.EndIf()); } else { builder.Append(batch.Sql); } builder.AppendLine(_sqlGenerator.BatchSeparator); builder.AppendLine(); } } } return builder.ToString(); }
public override string GenerateMetadata( string migrationNamespace, Type contextType, string migrationName, string migrationId, string productVersion, IModel targetModel) { Check.NotEmpty(migrationNamespace, nameof(migrationNamespace)); Check.NotNull(contextType, nameof(contextType)); Check.NotEmpty(migrationName, nameof(migrationName)); Check.NotEmpty(migrationId, nameof(migrationId)); Check.NotEmpty(productVersion, nameof(productVersion)); Check.NotNull(targetModel, nameof(targetModel)); var builder = new IndentedStringBuilder(); builder .AppendLine("using System;") .AppendLine("using Microsoft.Data.Entity;") .AppendLine("using Microsoft.Data.Entity.Metadata;") .AppendLine("using Microsoft.Data.Entity.Relational.Migrations.Infrastructure;") .Append("using ").Append(contextType.Namespace).AppendLine(";") .AppendLine() .Append("namespace ").AppendLine(migrationNamespace) .AppendLine("{"); using (builder.Indent()) { builder .Append("[ContextType(typeof(").Append(_code.Reference(contextType)).AppendLine("))]") .Append("partial class ").AppendLine(_code.Identifier(migrationName)) .AppendLine("{"); using (builder.Indent()) { builder .AppendLine("public override string Id") .AppendLine("{"); using (builder.Indent()) { builder.Append("get { return ").Append(_code.Literal(migrationId)).AppendLine("; }"); } builder .AppendLine("}") .AppendLine() .AppendLine("public override string ProductVersion") .AppendLine("{"); using (builder.Indent()) { builder.Append("get { return ").Append(_code.Literal(productVersion)).AppendLine("; }"); } builder .AppendLine("}") .AppendLine() .AppendLine("public override void BuildTargetModel(ModelBuilder builder)") .AppendLine("{"); using (builder.Indent()) { // TODO: Optimize. This is repeated below _modelGenerator.Generate(targetModel, builder); } builder.AppendLine("}"); } builder.AppendLine("}"); } builder.AppendLine("}"); return builder.ToString(); }
public override string GenerateSnapshot( string modelSnapshotNamespace, Type contextType, string modelSnapshotName, IModel model) { Check.NotEmpty(modelSnapshotNamespace, nameof(modelSnapshotNamespace)); Check.NotNull(contextType, nameof(contextType)); Check.NotEmpty(modelSnapshotName, nameof(modelSnapshotName)); Check.NotNull(model, nameof(model)); var builder = new IndentedStringBuilder(); builder .AppendLine("using System;") .AppendLine("using Microsoft.Data.Entity;") .AppendLine("using Microsoft.Data.Entity.Metadata;") .AppendLine("using Microsoft.Data.Entity.Relational.Migrations.Infrastructure;") .Append("using ").Append(contextType.Namespace).AppendLine(";") .AppendLine() .Append("namespace ").AppendLine(modelSnapshotNamespace) .AppendLine("{"); using (builder.Indent()) { builder .Append("[ContextType(typeof(").Append(_code.Reference(contextType)).AppendLine("))]") .Append("partial class ").Append(_code.Identifier(modelSnapshotName)).AppendLine(" : ModelSnapshot") .AppendLine("{"); using (builder.Indent()) { builder .AppendLine("public override void BuildModel(ModelBuilder builder)") .AppendLine("{"); using (builder.Indent()) { _modelGenerator.Generate(model, builder); } builder.AppendLine("}"); } builder.AppendLine("}"); } builder.AppendLine("}"); return builder.ToString(); }
public override void Generate(IModel model, IndentedStringBuilder stringBuilder) { stringBuilder.Append("var builder = new ModelBuilder()"); using (stringBuilder.Indent()) { GenerateAnnotations(model.Annotations.ToArray(), stringBuilder); } stringBuilder.AppendLine(";"); GenerateEntityTypes(model.EntityTypes, stringBuilder); stringBuilder .AppendLine() .Append("return builder.Model;"); }
public override void GenerateModelSnapshotClass( string @namespace, string className, IModel model, IndentedStringBuilder stringBuilder) { Check.NotEmpty(className, "className"); Check.NotEmpty(@namespace, "namespace"); Check.NotNull(model, "model"); Check.NotNull(stringBuilder, "stringBuilder"); // TODO: Consider namespace ordering, for example putting System namespaces first foreach (var ns in GetNamespaces(model).OrderBy(n => n).Distinct()) { stringBuilder .Append("using ") .Append(ns) .AppendLine(";"); } stringBuilder .AppendLine() .Append("namespace ") .AppendLine(@namespace) .AppendLine("{"); using (stringBuilder.Indent()) { stringBuilder .Append("public class ") .Append(className) .AppendLine(" : ModelSnapshot") .AppendLine("{"); using (stringBuilder.Indent()) { stringBuilder .AppendLine("public override IModel Model") .AppendLine("{"); using (stringBuilder.Indent()) { stringBuilder .AppendLine("get") .AppendLine("{"); using (stringBuilder.Indent()) { Generate(model, stringBuilder); } stringBuilder .AppendLine() .AppendLine("}"); } stringBuilder.AppendLine("}"); } stringBuilder.AppendLine("}"); } stringBuilder.Append("}"); }
public override bool GenerateProviderSpecificPropertyFacetsConfiguration( IProperty property, string entityVariableName, bool hadPreviousAppend, IndentedStringBuilder sb) { Check.NotNull(property, nameof(property)); Check.NotEmpty(entityVariableName, nameof(entityVariableName)); Check.NotNull(sb, nameof(sb)); var useIdentityFacetConfig = GenerateUseIdentityFacetConfiguration(property); if (string.IsNullOrEmpty(useIdentityFacetConfig)) { return hadPreviousAppend; } if (hadPreviousAppend) { sb.AppendLine(); } sb.AppendLine(); sb.Append(entityVariableName); sb.Append(".Property(e => e."); sb.Append(property.Name); sb.Append(")"); using (sb.Indent()) { sb.AppendLine(); sb.Append(".ForSqlServer()"); sb.Append(useIdentityFacetConfig); sb.Append(";"); } return true; }