Как вывести список метаданных столбцов таблицы с помощью NHibernate? - PullRequest
4 голосов
/ 25 ноября 2011

Как я могу перечислить метаданные столбцов (IColumnMetadata) таблицы, используя NHibernate для «любой» базы данных?

ITableMetadata содержит только GetColumnMetadata(), где мне нужно предоставить columnName. IDataBaseSchema содержит GetColumns(), что возвращает DataTable. Я нашел метод GetColumnName() на AbstractTableMetadata, который мог бы использовать, но он защищен и не содержится в ITableMetadata. Есть причина для этого?

Как этот API предназначен для использования?

Ответы [ 2 ]

0 голосов
/ 02 декабря 2014

Вы правы. 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);
    }
}
0 голосов
/ 29 ноября 2011

Предположительно, вы можете использовать Configuration.ClassMappings, чтобы получить список классов. Каждый из них будет иметь свойство Table, которое, в свою очередь, будет иметь свойство ColumnIterator. Вы должны быть в состоянии получить список имен столбцов из этого.

...