public async Task MigrateGroup1Preview()
    {
        var model = DbModelFactory.GenerateModel(new Migration1().Types);

        model.OutputTableDatas.PrintStringTable("Tables in Topological Order");

        //Also, let's do a spot check on the Quantity columns MyDecimalSqlTypeAttribute data type.
        var orderLine2Table = model.OutputTableDatas.Single(z => z.TableName.Table == nameof(OrderLine2));
        var quantityColumn  =
            orderLine2Table.ColumnCreationData.Single(z => z.ColumnDataName.Name == nameof(OrderLine2.Quantity));
        var myDecimalSqlTypeAttribute = quantityColumn.SqlTypeAttribute as MyDecimalSqlTypeAttribute;

        myDecimalSqlTypeAttribute.Precision.Should().Be(38);
        myDecimalSqlTypeAttribute.Scale.Should().Be(12);

        //And now let's print out the migration.
        var dbManipulator = new DbManipulator(new SqlServerDbAdapter(null),
                                              typeof(RunMigrationsTest).Assembly,
                                              new[] { "Group1" });

        dbManipulator.ShowSql         = true;
        dbManipulator.ShowElapsedTime = false;
        dbManipulator.PreviewOnly     = true;
        await dbManipulator.UpdateDatabase();
    }
    public void ConventionsTest()
    {
        var types = new List <Type>()
        {
            typeof(Job),
            typeof(Resource)
        };

        var dbModel = DbModelFactory.GenerateModel(types);

        var jobTable      = dbModel.OutputTableDatas.Single(z => z.TableName.Table == "Job");
        var resourceTable = dbModel.OutputTableDatas.Single(z => z.SourceType.Name == "Resource");

        Console.WriteLine(jobTable.ToString());
        Console.WriteLine(resourceTable.ToString());

        jobTable.ColumnCreationData[0].ColumnDataName.Name.Should().Be("Id");
        jobTable.ColumnCreationData[0].PrimaryKeyInformation.IsPrimaryKey.Should().BeTrue();
        jobTable.ColumnCreationData[0].IdentityInformation.Seed.Should().Be(1);
        jobTable.ColumnCreationData[0].IdentityInformation.Increment.Should().Be(1);

        var resourceIdColumn = jobTable.ColumnCreationData[1];

        resourceIdColumn.ForeignKeyInformation.ForeignSchemaName.Should().Be("dbo");
        resourceIdColumn.ForeignKeyInformation.ForeignTableName.Should().Be("Job");
        resourceIdColumn.ForeignKeyInformation.ForeignColumnNames.Should().Be("ResourceId");
        resourceIdColumn.ForeignKeyInformation.PrimarySchemaName.Should().Be("MySchema");
        resourceIdColumn.ForeignKeyInformation.PrimaryTableName.Should().Be("Production.Resource");
        resourceIdColumn.ForeignKeyInformation.PrimaryColumnNames.Should().Be("Id");

        resourceTable.ColumnCreationData[0].ColumnDataName.Name.Should().Be("Id");
        resourceTable.ColumnCreationData[0].PrimaryKeyInformation.IsPrimaryKey.Should().BeTrue();
        resourceTable.ColumnCreationData[0].IdentityInformation.Seed.Should().Be(1);
        resourceTable.ColumnCreationData[0].IdentityInformation.Increment.Should().Be(1);

        var rowVersionColumn = resourceTable.ColumnCreationData[1];

        rowVersionColumn.SqlTypeAttribute.Should().BeOfType <RowVersionTypeAttribute>();
    }
    public void TestNullables()
    {
        var types = new List <Type>()
        {
            typeof(TypeWithNullables),
        };

        var dbModel = DbModelFactory.GenerateModel(types);

        Console.WriteLine(dbModel.ToString());

        var(table, columns) = dbModel.OutputTableDatas[0];

        columns[0].ColumnDataName.Name.Should().Be("OrderNumber");
        columns[0].SqlTypeAttribute.AllowNull.Should().BeTrue();
        columns[0].SqlTypeAttribute.Should().BeOfType(typeof(Int32TypeAttribute));

        columns[1].ColumnDataName.Name.Should().Be("Description");
        columns[1].SqlTypeAttribute.AllowNull.Should().BeTrue();
        columns[1].SqlTypeAttribute.Should().BeOfType(typeof(StringTypeAttribute));

        columns[2].ColumnDataName.Name.Should().Be("Number");
        columns[2].SqlTypeAttribute.AllowNull.Should().BeFalse();
        columns[2].SqlTypeAttribute.Should().BeOfType(typeof(DoubleTypeAttribute));

        columns[3].ColumnDataName.Name.Should().Be("NumberNullable");
        columns[3].SqlTypeAttribute.AllowNull.Should().BeTrue();
        columns[3].SqlTypeAttribute.Should().BeOfType(typeof(DoubleTypeAttribute));

        columns[4].ColumnDataName.Name.Should().Be("NotNullObject");
        columns[4].SqlTypeAttribute.AllowNull.Should().BeFalse();
        columns[4].SqlTypeAttribute.Should().BeOfType(typeof(StringTypeAttribute));

        columns[5].ColumnDataName.Name.Should().Be("NullObject");
        columns[5].SqlTypeAttribute.AllowNull.Should().BeTrue();
        columns[5].SqlTypeAttribute.Should().BeOfType(typeof(StringTypeAttribute));
    }