所以我一直在用NHibernate做一些工作,虽然我所看到的大多数都很棒,但有一点让人感到沮丧。如果我尝试查询某些对象并且hbm文件中或与hbm文件存在映射问题,通常没有迹象表明存在映射问题,它只返回没有结果。
一个简单的例子是,如果我忘记将hbm文件设置为嵌入式资源,然后执行session.Query<Variable>().ToList()
,则没有迹象表明没有变量的映射,它只返回一个空列表。 / p>
有没有办法告诉NHibernate抛出异常或以其他方式表明在这种情况下映射存在问题?
这确实会导致异常:
_session.Get<Variable>(1)
但这些不是:
_session.Query<Variable>().Where(e => e.VariableId == 1).ToList()
_session.CreateCriteria(typeof(Variable)).Add(Restrictions.Eq("VariableId",1)).List<Variable>();
希望这是我做错了,或者可以配置的东西,否则它可能会成为使用NHibernate的交易破坏者。我可以在我自己的单元测试中相对容易地捕获这些东西,但是当其他开发人员开始接触它时,我可以看到这成为一个错误的节日。
答案 0 :(得分:1)
在对代码进行一些挖掘之后,我怀疑你是对的。未映射的类不会在List上抛出异常。
https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Impl/SessionImpl.cs#L1869
string[] implementors = Factory.GetImplementors(criteria.EntityOrClassName);
int size = implementors.Length;
CriteriaLoader[] loaders = new CriteriaLoader[size];
ISet<string> spaces = new HashSet<string>();
for (int i = 0; i < size; i++)
{
loaders[i] = new CriteriaLoader(
GetOuterJoinLoadable(implementors[i]),
Factory,
criteria,
implementors[i],
enabledFilters
);
spaces.UnionWith(loaders[i].QuerySpaces);
}
注意如果没有Factory.GetImplementors返回的实现者,没有生成错误,但没有做任何事情。因此,为什么你会看到一个空列表回来。
如果我们查看SessionFactoryImpl.GetImplementors,我们会发现,如果没有找到实现者,则不会抛出异常。只返回一个空数组的实现者。
因此可能需要检查一下,如果Factory.GetImplementors没有返回任何实现者,则需要抛出MappingException。