Вы правы. ITableMetadata не предоставляет имена столбцов в таблице. Кажется, что классы были разработаны для использования с файлами сопоставления, где имена столбцов указаны явно. Однако, если вы быстро заглянете в Reflector, вы обнаружите, что все имена столбцов на самом деле хранятся в закрытой переменной в классе AbstractTableMetadata (из которого происходят все реализации ITableMetadata.
Вот код для извлечения всех имен столбцов из всех таблиц в базе данных:
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);
}
}