让NHibernate报告映射问题

让NHibernate报告映射问题,nhibernate,Nhibernate,所以我一直在与NHibernate合作,虽然我所看到的大部分都很好,但有一点令人沮丧。如果我试图查询一些对象,但hbm文件中或与hbm文件一起存在映射问题,通常没有迹象表明存在映射问题,它只是不返回任何结果 一个简单的例子是,如果我忘记将hbm文件设置为嵌入式资源,然后执行会话.Query().ToList(),则没有迹象表明变量没有映射,它只返回一个空列表 有没有办法告诉NHibernate抛出一个异常或以其他方式表明在这种情况下映射有问题 这确实会导致异常: _session.Get<

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

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

有没有办法告诉NHibernate抛出一个异常或以其他方式表明在这种情况下映射有问题

这确实会导致异常:

_session.Get<Variable>(1) 
\u session.Get(1)
但这些并不是:

_session.Query<Variable>().Where(e => e.VariableId == 1).ToList()

_session.CreateCriteria(typeof(Variable)).Add(Restrictions.Eq("VariableId",1)).List<Variable>();
\u session.Query().Where(e=>e.VariableId==1.ToList())
_CreateCriteria(typeof(Variable)).Add(Restrictions.Eq(“VariableId”,1)).List();

希望这是我做错的事情,或者是可以配置的事情,否则它可能会破坏使用NHibernate的交易。我可以在自己的单元测试中相对容易地捕捉到这些东西,但我可以看到,当其他开发人员开始接触它时,这将成为一个bug的节日

在对代码进行了一些挖掘之后,我怀疑您是对的。未映射的类不会在列表上引发异常

string[]implementors=Factory.GetImplementors(criteria.EntityOrClassName);
int size=implementors.Length;
CriteriaLoader[]加载程序=新的CriteriaLoader[大小];
ISet空格=新的HashSet();
对于(int i=0;i
请注意,如果Factory.GetImplementors没有返回任何实现程序,则不会生成错误,但不会执行任何操作。因此,你会看到一个空的列表回来了

如果我们看一下,我们会发现,如果找不到实现者,在任何时候都不会抛出异常。只返回一个空的实现者数组


因此,可能需要检查,如果Factory.GetImplementors没有返回任何实现程序,则需要抛出MappingException。

在对代码进行了一些挖掘之后,我怀疑您是对的。未映射的类不会在列表上引发异常

string[]implementors=Factory.GetImplementors(criteria.EntityOrClassName);
int size=implementors.Length;
CriteriaLoader[]加载程序=新的CriteriaLoader[大小];
ISet空格=新的HashSet();
对于(int i=0;i
请注意,如果Factory.GetImplementors没有返回任何实现程序,则不会生成错误,但不会执行任何操作。因此,你会看到一个空的列表回来了

如果我们看一下,我们会发现,如果找不到实现者,在任何时候都不会抛出异常。只返回一个空的实现者数组


因此,可能需要检查,如果Factory.GetImplementors没有返回任何实现程序,则需要抛出MappingException。

我很惊讶它没有抛出异常。如果您使用QueryOver,它是否也会无声地失败?是的,我刚刚尝试了QueryOver,它也有相同的行为。我正在下载源代码以查看。开源的荣耀。有些东西告诉我在你的项目中有些不对劲。默认情况下,NHibernate抛出一个MappingException,其中包含一条“No persister for:entity”消息。有趣的是_session.Get(1)确实会引发异常,但是_session.Query()会引发异常,其中(e=>e.VariableId==1)。我认为区别可能在于。Get实际上取决于是否存在id映射。我很惊讶它没有抛出异常。如果您使用QueryOver,它是否也会无声地失败?是的,我刚刚尝试了QueryOver,它也有相同的行为。我正在下载源代码以查看。开源的荣耀。有些东西告诉我在你的项目中有些不对劲。默认情况下,NHibernate抛出一个MappingException,其中包含一条“No persister for:entity”消息。有趣的是_session.Get(1)确实会引发异常,但是_session.Query()会引发异常,其中(e=>e.VariableId==1)。我认为区别可能在于。Get真的取决于有一个id映射。是的,确实是这样。真遗憾。我听到了很多关于NHibernate的好东西,我真的很喜欢映射POCO是多么容易,但是像这样简单和基本的东西似乎没有被解决,这一事实可能会把我吓跑。我需要做的最后一件事是在4到5个月后发现我们的应用程序没有正常工作,因为一个开发人员摆弄了一个数据库映射,而ORM只是假装有一个空表。探索EF现在…是的,这是值得关注的,现在EF是开源的,它确实使它成为一个可行的替代方案是的。EF映射文件有点复杂,因此当我达到这一点时,将需要更多的工作来自动生成,但看起来不会太糟糕。因此,我在NHibernate用户论坛上发布了这个问题,但从未得到任何回应。在这个问题和他们的论坛上没有回应之间,我似乎不相信这件事
            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);
            }