2012-03-15 1 views
3

Я пытаюсь написать тест для своих сопоставлений NHibernate, который автоматически подберет и проверит все новые сопоставления, которые будут добавлены.Возможно ли получить список всех отображаемых объектов из NHibernate IStatelessSession или ISession?

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

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

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

+0

ответ Николая указал мне в правильном направлении, хотя я использую IStatelessSession так что мне нужно позвонить 'session.GetSessionImplementation(). Factory.GetAllClassMetadata()' для получения метаданных. – Eamon

ответ

5

Вы можете получить 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)); 
    } 
}  
+0

GetAllClassMetadata() был всего лишь методом, который я искал. – Eamon

0

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

2

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

[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

Спасибо, но я старался не открывать конфигурацию. – Eamon

Смежные вопросы