如何在“any”数据库上使用NHibernate列出表的列元数据(IColumnMetadata
)?
ITableMetadata
仅包含GetColumnMetadata()
,我需要提供columnName
。 IDataBaseSchema
包含返回普通GetColumns()
的{{1}}。我在DataTable
上找到了可以使用的方法GetColumnName()
,但它受到保护而未包含在AbstractTableMetadata
中。有什么理由吗?
如何使用此API?
答案 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);
}
}