为什么即使最简单的NHibernate示例标准也不起作用?

时间:2010-01-14 10:38:39

标签: .net nhibernate criteria

我想做最简单的工作:获取名为“Potatoes”的产品。

// solution 1 - Using Expression.Eq
return session.CreateCriteria<Product>().Add(Expression.Eq("Name", "Potatoes")).List<Product>();        

// solution 2 - Using Example
Product exampleProduct = new Product();
exampleProduct.Name = "Potatoes";
return session.CreateCriteria<Product>().Add(Example.Create(exampleProduct)).List<Product>();

解决方案1和2应该是相同的,为什么解决方案1返回一个对象而解决方案2返回零对象?

修改

根据Diego的回答找到解决方案。在使用Fluent时,我不知道如何显示由NHibernate生成的SQL。这是一个片段:

[R

eturn Fluently.Configure()
              .Database(
                MsSqlConfiguration.MsSql2008.ShowSql().ConnectionString(x =>
                {
                    x.TrustedConnection();
                    x.Server(@"ANDRE-PC\SQLEXPRESS");
                    x.Database("FluentHibernateTest");
                })
              ).Mappings(m => m.FluentMappings.AddFromAssemblyOf<Program>()).BuildSessionFactory();

在我看到SQL后,很明显NHibernate正在考虑像迭戈所说的那样。

SQL看起来像:

SELECT this_.Id as Id0_0_, this_.Name as Name0_0_, this_.Price as Price0_0_ FROM [Product] this_ WHERE (this_.Name = 'Potatoes' and this_.Price = 0); 

修复的解决方案2是:

// solution 2 - Using Example
Product exampleProduct = new Product();
exampleProduct.Name = "Potatoes";
return Session.CreateCriteria<Product>().Add(Example.Create(exampleProduct).ExcludeZeroes()).List<Product>();

1 个答案:

答案 0 :(得分:2)

他们不一定平等。您的示例查询可能包括一些其他具有默认值的字段(可能类似Active = false)。

您应该排除不喜欢用于过滤器的字段。一个好的开始是ExcludeZeroes()

在任何情况下,请检查生成的SQL。您可以使用NHibernate配置文件中的以下属性执行此操作:

<property name="show_sql">true</property>

...或者你可以使用像NHProf这样的工具,或者你的数据库分析器工具,log4net输出等。