一旦我在NHibernate中映射了我的域,如何在代码中的其他地方反向查找这些映射?
示例:
由于某种原因,实体Pony
被映射到名为“AAZF1203”的表。 (愚蠢的遗留数据库表名!)我想仅使用typeof(Pony)
从NH映射中找出该表名,因为我必须在其他地方编写查询。
private const string LegacyPonyTableName = "AAZF1203";
[Test]
public void MakeSureThatThePonyEntityIsMappedToCorrectTable()
{
string ponyTable = GetNHibernateTableMappingFor(typeof(Pony));
Assert.AreEqual(LegacyPonyTableName, ponyTable);
}
换句话说,GetNHibernateTableMappingFor(Type t)
需要看起来像什么?
答案 0 :(得分:12)
您需要哪些信息?
因为这取决于你拥有的......
不久前,我必须从审计事件监听器获取表名,我使用了这个:
IPostDatabaseOperationEventArgs args //parameter
var tableName = ((ILockable)args.Persister).RootTableName.ToLower();
你也可以从会议中得到它......
((ILockable)session.GetSessionImplementation()
.GetEntityPersister(null, new Pony())).RootTableName
答案 1 :(得分:2)
我发现这可以获取实体持久化的表的名称。
NHibernate.Cfg.Configuration
NHibernate.Mapping.Table
的实例。Name
实例的Table
属性对应于实体持久化的表的名称。请参阅下面的代码。
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;
这可以包含在像这样的函数中
public static String GetTableName<T>(NHibernate.Cfg.Configuration config)
{
return config.GetClassMapping(typeof(T)).RootTable.Name;
}
注意:奇怪的是,属性Catalog
和Schema of the
NHibernate.Mapping.Table`没有任何价值。至少,不是我的情况。