2012-08-09 40 views
0

有一個包這樣映射:如何獲取簡單包的表名?

<bag name="Addresses" table="address" cascade="all-delete-orphan"> 
    <key column="employee"/> 
    <element column="address"/> 
</bag> 

如何我可以在運行時的表名,其中地址存儲?

如果集合泛型類型是一個NHibernate的映射類我可以做這樣的:

var tableName = (sessionFactory.GetClassMetadata(itemType) as SingleTableEntityPersister).TableName; 

但是,在這種情況下,集合泛型類型只是一個字符串,我找不到任何方式從元數據中檢索表名。

感謝您的幫助!

回答

1

將很有趣,知道你需要這個。然而

var metaData = sf.GetClassMetadata("containingType"); 
var c = (CollectionType)metaData.PropertyTypes[Array.IndexOf(metaData.PropertyNames, "collectionPropertyName")]; 
var tablename = c.GetAssociatedJoinable((ISessionFactoryImplementor)sf).TableName; 
+0

的原因,我需要的元數據實體的,所以我可以使用批量插入/用'NpgsqlCopyIn'更新。 – 2012-08-16 10:20:02

+0

哦,很酷,我需要,可能仍然需要這樣的im /數據導出 – Firo 2012-08-16 11:05:02

+0

這是很好的,比其他選項批量插入/更新快很多,根據這篇文章的正常插入時間的約2.7%:http:///www.depesz.com/2007/07/05/how-to-insert-data-to-database-as-fast-as-possible/ – 2012-08-16 11:18:15

0

另一種可能的解決方案:

var classMetadata= sessionFactory.GetClassMetadata(typeof(parentClass)) as SingleTableEntityPersister; 
var key = classMetadata.RootEntityName + "." + propertyName; 
var allCollectionMetadata = sessionFactory.GetAllCollectionMetadata(); 
var childTableName = (allCollectionMetadata[key] as BasicCollectionPersister).TableName;