Как найти отображение таблицы сущности NHibernate по типу сущности? - PullRequest
6 голосов
/ 12 марта 2010

Как только я сопоставил свой домен в NHibernate, как я могу отменить поиск этих сопоставлений где-то еще в моем коде?

Пример:

Сущность Pony по какой-то причине сопоставлена ​​с таблицей с именем "AAZF1203". (Глупые устаревшие имена таблиц базы данных!) Я хочу узнать это имя таблицы из сопоставлений NH, используя только typeof(Pony), потому что мне нужно написать запрос в другом месте.

Как мне пройти следующий тест?

private const string LegacyPonyTableName = "AAZF1203";

[Test]
public void MakeSureThatThePonyEntityIsMappedToCorrectTable()
{
    string ponyTable = GetNHibernateTableMappingFor(typeof(Pony));
    Assert.AreEqual(LegacyPonyTableName, ponyTable);
}

Другими словами, как должен выглядеть GetNHibernateTableMappingFor(Type t)

Ответы [ 2 ]

12 голосов
/ 12 марта 2010

В какой момент вам нужна эта информация?

Потому что это зависит от того, что у тебя есть ...

Не так давно мне нужно было получить имя таблицы от прослушивателя событий аудита, и я использовал это:

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

Вы также можете получить его из сеанса ...

((ILockable)session.GetSessionImplementation()
                   .GetEntityPersister(null, new Pony())).RootTableName
2 голосов
/ 18 октября 2013

Я нашел, что это работает, чтобы получить имя таблицы, в которой сохраняются сущности.

  1. Вы должны иметь экземпляр NHibernate.Cfg.Configuration
  2. Вы запрашиваете экземпляр NHibernate.Mapping.Table для данного постоянного типа.
  3. Свойство 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` не имеют значения. По крайней мере, не в моем случае.

...