public void WhenTableIsForeignKeyTable_ShouldReturnNavigationProperty()
            {
                //Arrange
                ISchemaTable table = new SqlSchemaTable(
                    schema: "dbo",
                    name  : "SagaMessage",
                    isView: false);

                ISchemaForeignKey foreignKey = new SqlSchemaForeignKey(
                    foreignKeySchema   : "dbo",
                    foreignKeyTableName: "SagaMessage",
                    foreignKeyColumn   : "SagaId",
                    primaryKeySchema   : "dbo",
                    primaryKeyTableName: "Saga",
                    primaryKeyColumn   : "SagaId",
                    constraintName     : "FK_SagaMessage_Saga_SagaId");

                AutoFaker.Provide(table);
                AutoFaker.Provide(foreignKey);
                AutoFaker.Provide<INavigationPropertyInfoAdapter, NavigationPropertyInfoAdapter>();

                A.CallTo(() => AutoFaker.Resolve<IReverseEngineeringConfiguration>().Pluralize).Returns(true);

                //Act
                var result = AutoFaker.Resolve<INavigationPropertyInfoAdapter>().GetPropertyText();

                //Assert
                result.ShouldBeEquivalentTo(
                    "public virtual Saga Saga { get; set; } // FK_SagaMessage_Saga_SagaId");
            }          
            public void WhenTableNameIsValid_ShouldReturnMap()
            {
                //Arrange;
                var table = new SqlSchemaTable("Saga", "dbo", false);

                var provider = AdapterFactory.Create(table, null);

                //Act
                var result = provider.GetTableMappingText();

                //Assert
                result.ShouldBeEquivalentTo(@"this.ToTable(""Saga"");");
            }
        private IReadOnlyList<ISchemaTable> InternalRead(SqlConnection connection)
        {
            var foreignKeys = this.LoadForeignKeySchemas(connection).ToList();

            var tables = new List<SqlSchemaTable>();

            using(var cmd = connection.CreateCommand())
            {
                cmd.CommandText = TablesSchemaSql;

                SqlSchemaTable table = null;

                using(var reader = cmd.ExecuteReader())
                {
                    while(reader.Read())
                    {
                        var tableName = reader["TableName"].ToString().Trim();
                        var schemaName = reader["SchemaName"].ToString().Trim();

                        //create table if one was not created before, and add the foreign keys plus the related keys
                        if(table == null || !table.Schema.Equals(schemaName) || !table.Name.Equals(tableName))
                        {
                            table = new SqlSchemaTable(
                                tableName,
                                schemaName,
                                bool.Parse(reader["IsView"].ToString()));

                            table.ForeignKeys.AddRange(
                                foreignKeys.Where(
                                    key =>
                                    key.ForeignKeySchema.Equals(table.Schema) && key.ForeignKeyTableName.Equals(table.Name) ||
                                    key.PrimaryKeySchema.Equals(table.Schema) && key.PrimaryKeyTableName.Equals(table.Name)));

                            tables.Add(table);
                        }

                        var columnSchema = new SqlSchemaColumn(
                            reader["ColumnName"].ToString().Trim(),
                            reader["TypeName"].ToString().Trim(),
                            this.GetPropertyTypeFromSqlType(reader["TypeName"].ToString().Trim()),
                            (int) reader["DateTimePrecision"],
                            reader["DefaultValue"].ToString().Trim(),
                            (int) reader["MaxLength"],
                            (int) reader["Precision"],
                            (int) reader["Scale"],
                            (int) reader["Ordinal"],
                            reader["IsIdentity"].ToString().Trim().ToLower() == "true",
                            reader["IsNullable"].ToString().Trim().ToLower() == "true",
                            reader["IsPrimaryKey"].ToString().Trim().ToLower() == "true",
                            reader["IsStoreGenerated"].ToString().Trim().ToLower() == "true");

                        table.Columns.Add(columnSchema);
                    }
                }
            }

            return tables.AsReadOnly();
        }
            public void WhenTableIsForeignKeyTable_ShouldReturnMap()
            {
                //Arrange
                ISchemaTable table = new SqlSchemaTable(
                    schema: "dbo",
                    name  : "SagaMessage",
                    isView: false);

                ISchemaForeignKey foreignKey = new SqlSchemaForeignKey(
                    foreignKeySchema   : "dbo",
                    foreignKeyTableName: "SagaMessage",
                    foreignKeyColumn   : "SagaId",
                    primaryKeySchema   : "dbo",
                    primaryKeyTableName: "Saga",
                    primaryKeyColumn   : "SagaId",
                    constraintName     : "FK_SagaMessage_Saga_SagaId");

                AutoFaker.Provide(table);
                AutoFaker.Provide(foreignKey);
                AutoFaker.Provide<INavigationPropertyInfoAdapter, NavigationPropertyInfoAdapter>();

                A.CallTo(() => AutoFaker.Resolve<IReverseEngineeringConfiguration>().Pluralize).Returns(true);

                //Act
                var result = AutoFaker.Resolve<INavigationPropertyInfoAdapter>().GetMapppingText();

                //Assert
                result.ShouldBeEquivalentTo(
                    @"HasRequired(a => a.Saga).WithMany(b => b.SagaMessages).HasForeignKey(c => c.SagaId); // FK_SagaMessage_Saga_SagaId");
            }