我正在尝试为我的NHibernate映射编写一个测试,它将自动拾取并测试任何新添加的映射。
目前我有一个测试打开了一个已知测试数据库的会话,然后尝试加载每个类型的第一个实体,并断言它不是空的。
这一切都运行正常,但这意味着每次添加新的实体映射时,我都需要记住更新测试。
所以,我想要做的是检查映射并尝试加载每个映射实体中的一个,但是我的测试看不到构建sessionfactory的NHibernate Configuration对象,所以我想知道是否存在是一种从会话中访问映射实体列表的方法,还是需要公开原始配置?
答案 0 :(得分:5)
您可以从Session获取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));
}
}
答案 1 :(得分: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.");
}
答案 2 :(得分:0)
如果每个实体只有一行,那么您可以发出session.QueryOver<object>().List();