public void Generate_migration_class()
        {
            var upgradeOperations
                = new[]
                {
                new AddColumnOperation("dbo.MyTable", new Column("Foo", typeof(int))),
                new AddColumnOperation("dbo.MyTable", new Column("Bar", typeof(int)))
                };

            var downgradeOperations
                = new[]
                {
                new DropColumnOperation("dbo.MyTable", "Foo"),
                new DropColumnOperation("dbo.MyTable", "Bar")
                };

            var migration
                = new MigrationInfo("000000000000001_Name")
                {
                UpgradeOperations   = upgradeOperations,
                DowngradeOperations = downgradeOperations
                };

            var codeGenerator = new CSharpMigrationCodeGenerator(new CSharpModelCodeGenerator());
            var stringBuilder = new IndentedStringBuilder();

            codeGenerator.GenerateMigrationClass("MyNamespace", "MyClass", migration, stringBuilder);

            Assert.Equal(
                @"using Microsoft.Data.Entity.Migrations;
using Microsoft.Data.Entity.Migrations.Builders;
using Microsoft.Data.Entity.Migrations.Model;
using System;

namespace MyNamespace
{
    public partial class MyClass : Migration
    {
        public override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.AddColumn(""dbo.MyTable"", ""Foo"", c => c.Int());
            
            migrationBuilder.AddColumn(""dbo.MyTable"", ""Bar"", c => c.Int());
        }
        
        public override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropColumn(""dbo.MyTable"", ""Foo"");
            
            migrationBuilder.DropColumn(""dbo.MyTable"", ""Bar"");
        }
    }
}",
                stringBuilder.ToString());
        }
        private void GenerateAndValidateCode(MigrationInfo migration)
        {
            var @namespace = GetType().Namespace + ".DynamicallyCompiled";
            var className  = "Migration" + Guid.NewGuid().ToString("N");

            var generator                = new CSharpMigrationCodeGenerator(new CSharpModelCodeGenerator());
            var migrationBuilder         = new IndentedStringBuilder();
            var migrationMetadataBuilder = new IndentedStringBuilder();

            generator.GenerateMigrationClass(@namespace, className, migration, migrationBuilder);
            generator.GenerateMigrationMetadataClass(@namespace, className, migration, typeof(DbContext), migrationMetadataBuilder);

            var migrationSource         = migrationBuilder.ToString();
            var migrationMetadataSource = migrationMetadataBuilder.ToString();

            Assembly.Load("System.Linq.Expressions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");

            var compiledAssembly = CodeGeneratorTestHelper.Compile(
                @namespace + ".dll",
                new[] { migrationSource, migrationMetadataSource },
                new[]
            {
                "mscorlib",
                "System.Core",
                "System.Linq.Expressions",
                "System.Runtime",
                "EntityFramework.Core",
                "EntityFramework.Relational",
                "EntityFramework.Migrations"
            });

            var compiledMigration = new MigrationInfo(
                (Migration)compiledAssembly.CreateInstance(@namespace + "." + className));

            generator                = new CSharpMigrationCodeGenerator(new CSharpModelCodeGenerator());
            migrationBuilder         = new IndentedStringBuilder();
            migrationMetadataBuilder = new IndentedStringBuilder();

            generator.GenerateMigrationClass(@namespace, className, compiledMigration, migrationBuilder);
            generator.GenerateMigrationMetadataClass(@namespace, className, compiledMigration, typeof(DbContext), migrationMetadataBuilder);

            Assert.Equal(migrationSource, migrationBuilder.ToString());
            Assert.Equal(migrationMetadataSource, migrationMetadataBuilder.ToString());
        }
        public void Generate_migration_class()
        {
            var upgradeOperations
                = new[]
                    {
                        new AddColumnOperation("dbo.MyTable", new Column("Foo", typeof(int))),
                        new AddColumnOperation("dbo.MyTable", new Column("Bar", typeof(int)))
                    };

            var downgradeOperations
                = new[]
                    {
                        new DropColumnOperation("dbo.MyTable", "Foo"),
                        new DropColumnOperation("dbo.MyTable", "Bar")
                    };

            var migration
                = new MigrationMetadata("000000000000001_Name")
                    {
                        UpgradeOperations = upgradeOperations,
                        DowngradeOperations = downgradeOperations
                    };

            var codeGenerator = new CSharpMigrationCodeGenerator(new CSharpModelCodeGenerator());
            var stringBuilder = new IndentedStringBuilder();

            codeGenerator.GenerateMigrationClass("MyNamespace", "MyClass", migration, stringBuilder);

            Assert.Equal(
                @"using Microsoft.Data.Entity.Migrations;
using Microsoft.Data.Entity.Migrations.Builders;
using System;

namespace MyNamespace
{
    public partial class MyClass : Migration
    {
        public override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.AddColumn(""dbo.MyTable"", ""Foo"", c => c.Int());
            
            migrationBuilder.AddColumn(""dbo.MyTable"", ""Bar"", c => c.Int());
        }
        
        public override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropColumn(""dbo.MyTable"", ""Foo"");
            
            migrationBuilder.DropColumn(""dbo.MyTable"", ""Bar"");
        }
    }
}",
                stringBuilder.ToString());
        }