How to look up an NHibernate entity's table mapping from the type of the entity?
Once I've mapped my domain in NHibernate, how can I reverse lookup those mappings somewhere else in my code?
Example:
The entity Pony
is mapped to a table named "AAZF1203" for some reason. (Stupid legacy database table names!) I want to find out that table name from the NH mappings using only the typeof(Pony)
because I have to write a query elsewhere.
How can I make the following test pass?
private const string LegacyPonyTableName = "AAZF1203";
[Test]
public void MakeSureThatThePonyEntityIsMappedToCorrectTable()
{
string ponyTable = GetNHibernateTableMappingFo开发者_Python百科r(typeof(Pony));
Assert.AreEqual(LegacyPonyTableName, ponyTable);
}
In other words, what does the GetNHibernateTableMappingFor(Type t)
need to look like?
At which point do you need that information?
Because it depends on what you have...
Not long ago I had to get the table name from an audit event listener, and I used this:
IPostDatabaseOperationEventArgs args //parameter
var tableName = ((ILockable)args.Persister).RootTableName.ToLower();
You could also get it from the session...
((ILockable)session.GetSessionImplementation()
.GetEntityPersister(null, new Pony())).RootTableName
I have found this to work to get the name of the table where the entities are persisted.
- You have to have an instance of
NHibernate.Cfg.Configuration
- You request an instance of
NHibernate.Mapping.Table
for the given persistent type. - The
Name
property of theTable
instance corresponds to the name of the the table where the entities are persisted.
See the code below.
NHibernate.Cfg.Configuration config = new Configuration();
/*
The initialisation here like config.AddAssembly(... and so forth
*/
NHibernate.Mapping.Table table = config.GetClassMapping(typeof(T)).RootTable;
String NameOfTableOfInterest = table.Name;
This could be wrapped in a function like so
public static String GetTableName<T>(NHibernate.Cfg.Configuration config)
{
return config.GetClassMapping(typeof(T)).RootTable.Name;
}
NOTE: Strange enough, the properties Catalog
and Schema of the
NHibernate.Mapping.Table` have no value. At least, not in my case.
精彩评论