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