1

所以我一直在用 NHibernate 做一些工作,虽然我所看到的大部分都很棒,但有一件事有点令人沮丧。如果我尝试查询某些对象并且在 hbm 文件中或与 hbm 文件之间存在映射问题,通常没有迹象表明存在映射问题,它只是不返回任何结果。

一个简单的例子是,如果我忘记将 hbm 文件设置为嵌入资源,然后执行 a session.Query<Variable>().ToList(),则没有迹象表明变量没有映射,它只是返回一个空列表。

有没有办法告诉 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 的交易破坏者。我可以在我自己的单元测试中相对容易地捕捉到这些东西,但是当其他开发人员开始接触它时,我可以看到这变成了一个错误的节日。

4

1 回答 1

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。

于 2013-07-22T22:23:00.857 回答