无法在NHibernate中执行查询

时间:2011-07-02 03:58:57

标签: nhibernate nhibernate-mapping

我尝试使用本教程:Hello NHibernate

这是我的配置NHibernate文件:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="hibernate-configuration" requirePermission="false" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/>
  </configSections>
  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <reflection-optimizer use="false"/>
    <session-factory>
      <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
      <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
      <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
      <property name="connection.connection_string">Data Source=.\SQLEXPRESS; Initial Catalog=dbTest; Trusted_Connection=true;</property>
      <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
      <property name="show_sql">true</property>
      <mapping resource="TestNHibernate.user.hbm.xml" assembly="TestNHibernate"/>
    </session-factory>
  </hibernate-configuration></configuration>

这是我的映射文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                           assembly="TestNHibernate"
                           namespace="TestNHibernate">
  <class name="user" table="user">
    <id name="Id">
      <generator class="identity"/>
    </id>
    <property name="Name"  />
  </class>
</hibernate-mapping>

班级用户:

 class user
    {

        public virtual int Id { get;set; }
        public virtual string Name { get; set; }
    }

这是查询代码:

 Configuration config = new Configuration();
                config.AddAssembly(typeof(user).Assembly);
                ISessionFactory sessionFactory = config.BuildSessionFactory();

                using (var session = sessionFactory.OpenSession())
                {                   
                    IQuery query = session.CreateQuery("from user as u");
                    IList<user> lst = query.List<user>();
                    foreach (var user in lst)
                    {
                        Console.WriteLine(user.Name);
                    }
                }

始终显示错误:

  

无法执行查询[select   user0_.Id为Id0_,user0_.Name为   来自用户user0_的Name0_ [SQL:select   user0_.Id为Id0_,user0_.Name为   Name0_来自用户user0 _]

我试图插入,更新,但它也显示无法插入,更新。我的问题在哪里?

是否有我的映射文件? 请给我建议!谢谢!

3 个答案:

答案 0 :(得分:1)

如果您使用此代码,NHibernate将生成数据库架构和数据库脚本,以防止区分大小写或其他错误。

 var conf = new NHibernate.Cfg.Configuration();
        conf.Configure();


        var export = new SchemaExport(conf);
        export.SetOutputFile(@"DatabaseScript.sql");
        export.Drop(true, true);
        export.Create(true, true);

我认为“用户”也可以是一个保留字!尝试:

IQuery query = session.CreateQuery("from [user] as u");

答案 1 :(得分:1)

两件事:

(1)在您的映射文件中,您应该将User表括在方括号中,例如[用户]。 User是SQL Server(以及大多数其他SQL系统)中的保留关键字。

<class name="user" table="[user]">

(2)每当你在NHibernate中得到异常时,进入调试模式并查看内部异常。这些通常会提供有关问题的提示。

答案 2 :(得分:0)

确保映射中的表名和列名与数据库模式中定义的名称完全匹配。区分大小写也很重要,具体取决于您的SQL Server配置。