是否可以从NHibernate TelessSession或ISession获取所有映射实体的列表?

是否可以从NHibernate TelessSession或ISession获取所有映射实体的列表?,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我正在尝试为我的NHibernate映射编写一个测试,它将自动拾取并测试添加的任何新映射 目前,我有一个测试,它打开一个到已知测试数据库的会话,然后尝试加载每种类型的第一个实体,并断言它不是null 这一切都很好,但这意味着每次添加新的实体映射时,我都需要记住更新测试 所以,我要做的是检查映射并尝试加载每个映射实体中的一个,但是生成sessionfactory的NHibernate配置对象对我的测试不可见,因此我想知道是否有方法从会话访问映射实体的列表,或者我是否需要公开原始配置?您可以从会话获

我正在尝试为我的NHibernate映射编写一个测试,它将自动拾取并测试添加的任何新映射

目前,我有一个测试,它打开一个到已知测试数据库的会话,然后尝试加载每种类型的第一个实体,并断言它不是null

这一切都很好,但这意味着每次添加新的实体映射时,我都需要记住更新测试


所以,我要做的是检查映射并尝试加载每个映射实体中的一个,但是生成sessionfactory的NHibernate配置对象对我的测试不可见,因此我想知道是否有方法从会话访问映射实体的列表,或者我是否需要公开原始配置?

您可以从会话获取sessionfactory,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));
    }
}    

如果每个实体只有一行,则可以发出
session.QueryOver().List();

我公开配置对象,并执行一个映射,以这样查询我的所有实体。它将输出我的每个映射中的所有错误:

[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.");
}

GetAllClassMetadata()正是我所寻找的方法。Nikolay的回答为我指明了正确的方向,尽管我使用的是IStatelessSession,所以我需要调用
session.GetSessionImplementation().Factory.GetAllClassMetadata()
,以获取元数据。谢谢,但我试图避免暴露配置。