2012-08-09 2 views
0

Ayant un sac cartographiés comme ceci:Comment obtenir le nom d'une table pour un sac simple?

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

Comment puis-je obtenir à l'exécution le nom du tableau dans lequel les adresses sont stockées?

Si les collections de type générique est une NHibernate classe mappées aurait pu le faire comme ceci:

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

Mais dans ce cas, les collections de type générique est juste une chaîne et je ne pouvais pas trouver un moyen de récupérer le nom de la table à partir des métadonnées.

Merci pour votre aide!

Répondre

1

serait intéressant de savoir où vous en avez besoin. Néanmoins

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

La raison pour laquelle j'ai besoin les métadonnées pour les entités est que je peux utiliser insertion en vrac/mise à jour avec 'NpgsqlCopyIn'. –

+0

oh cool, j'ai besoin et peut-être encore besoin de quelque chose comme ça pour im/export de données – Firo

+0

il est agréable, beaucoup plus rapide que d'autres options pour l'insertion en vrac/mise à jour, environ 2,7% de temps d'insertion normale selon cet article: http://www.depesz.com/2007/07/05/how-to-insert-data-to-database-as-fast-as-possible/ –

0

Une autre solution possible:

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