如何使用NHibernate列出表的列元数据?

时间:2011-11-25 18:33:22

标签: c# .net nhibernate nhibernate-mapping

如何在“any”数据库上使用NHibernate列出表的列元数据(IColumnMetadata)?

ITableMetadata仅包含GetColumnMetadata(),我需要提供columnNameIDataBaseSchema包含返回普通GetColumns()的{​​{1}}。我在DataTable上找到了可以使用的方法GetColumnName(),但它受到保护而未包含在AbstractTableMetadata中。有什么理由吗?

如何使用此API?

2 个答案:

答案 0 :(得分:0)

可以假设您可以使用Configuration.ClassMappings来获取映射的类列表。每个属性都有Table属性,而属性又有ColumnIterator属性。您应该能够从中获取列名列表。

答案 1 :(得分:0)

你是对的。 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);
    }
}