You are right. ITableMetadata does not expose the names of the columns in the table. It seems that the classes were designed to be used with mapping files where column names are explicitly given. However, if you take quick peek using Reflector, you will find that all the column names are actually stored in a private variable in the AbstractTableMetadata class (of which all implementations of ITableMetadata derive.
Here is the code to retrieve all column names from all tables in the database:
var dialect = sess.GetSessionImplementation().Factory.Dialect;
var dbSchema = dialect.GetDataBaseSchema(sess.Connection as DbConnection);
foreach (DataRow row in (sess.Connection as DbConnection).GetSchema("Tables").Rows)
{
ITableMetadata md = dbSchema.GetTableMetadata(row, false);
var hiddenColumnsProperty = typeof(AbstractTableMetadata).GetField("columns", BindingFlags.NonPublic | BindingFlags.Instance);
var columns = hiddenColumnsProperty.GetValue(md) as Dictionary<string, IColumnMetadata>;
foreach (var colName in columns.Keys)
{
Console.WriteLine(md.Name+"."+colName);
}
}