2012-08-09 56 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;