让NHibernate报告映射问题

时间:2013-07-22 16:21:14

标签: nhibernate

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

1 个答案:

答案 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。