如何从实体类型中查找NHibernate实体的表映射?

时间:2010-03-11 23:55:39

标签: c# nhibernate nhibernate-mapping

一旦我在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)需要看起来像什么?

2 个答案:

答案 0 :(得分:12)

您需要哪些信息?

因为这取决于你拥有的......

不久前,我必须从审计事件监听器获取表名,我使用了这个:

IPostDatabaseOperationEventArgs args //parameter
var tableName = ((ILockable)args.Persister).RootTableName.ToLower();

你也可以从会议中得到它......

((ILockable)session.GetSessionImplementation()
                   .GetEntityPersister(null, new Pony())).RootTableName

答案 1 :(得分:2)

我发现这可以获取实体持久化的表的名称。

  1. 您必须拥有NHibernate.Cfg.Configuration
  2. 的实例
  3. 您为给定的持久类型请求NHibernate.Mapping.Table的实例。
  4. Name实例的Table属性对应于实体持久化的表的名称。
  5. 请参阅下面的代码。

    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;
    }
    

    注意:奇怪的是,属性CatalogSchema of the NHibernate.Mapping.Table`没有任何价值。至少,不是我的情况。