Можно ли получить список всех сопоставленных сущностей из NHibernate IStatelessSession или ISession? - PullRequest
3 голосов
/ 15 марта 2012

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

В данный момент у меня есть тест, который открывает сеанс в известной тестовой базе данных.затем пытается загрузить первую сущность каждого типа и утверждает, что она не равна нулю.

Это все работает нормально, но это означает, что каждый раз, когда я добавляю новое сопоставление сущностей, мне нужно помнить об обновлении теста.

Итак, я хочу проверить сопоставления и попытаться загрузить по одному из каждого сопоставленного объекта, но объект конфигурации NHibernate, из которого построен сессионный завод, не виден моему тесту, поэтому я былинтересно, есть ли способ получить доступ к списку сопоставленных объектов из сеанса или мне нужно вместо этого выставить исходную конфигурацию?

Ответы [ 3 ]

5 голосов
/ 15 марта 2012

Вы можете получить SessionFactory из Session, а SessionFactory имеет метод GetAllClassMetadata (), который возвращает список IClassMetadata.А из IClassMetadata вы можете получить MappedClass (GetMappedClass ())

Но вам понадобится дополнительная работа для получения подклассов.Этот код может помочь:

var metaData = this.session.SessionFactory.GetClassMetadata(baseClass);
if (metaData != null && metaData.HasSubclasses)
{
    foreach (string entityName in ((NHibernate.Persister.Entity.IEntityPersister)metaData).EntityMetamodel.SubclassEntityNames)
    {
        var metadata = this.session.SessionFactory.GetClassMetadata(entityName);
        result.Add(metadata.GetMappedClass(EntityMode.Poco));
    }
}    
2 голосов
/ 15 марта 2012

Я выставляю объект конфигурации и делаю сопоставление, которое запрашивает все мои объекты, как это. Он выведет все ошибки из каждого из моих сопоставлений .:

[TestMethod()]
public void AllNHibernateMappingsAreOkay()
{
    bool failed = false;
    log4net.Config.XmlConfigurator.Configure();

    using (ISession session = SessionFactory.GetCurrentSession())
    {
        foreach (var s in SessionFactory.GetConfig().ClassMappings)
        {
            try
            {
                SessionFactory.GetCurrentSession().CreateQuery(string.Format("from {0} e", s.MappedClass.Name))
                    .SetFirstResult(0).SetMaxResults(50).List();
            }
            catch (Exception ex)
            {
                failed = true;
                log.ErrorFormat("\r\n\r\n {0} \r\n {1} \r\n\r\n", ex.Message, ex.InnerException.Message);   
            }
        }
    }

    Assert.IsFalse(failed, "One or more mappings have errors in them.  Please refer to output or logs.");
}
0 голосов
/ 15 марта 2012

если у вас есть только одна строка для каждой сущности, вы можете выдать session.QueryOver<object>().List();

...