代码之家  ›  专栏  ›  技术社区  ›  Mac

用NHibernate映射Northwind客户的问题

  •  0
  • Mac  · 技术社区  · 15 年前

    作为NHibernate(2.1.0)的初学者,我正在尝试使用著名的Northwind数据库设置我的第一个单元测试。测试过程如下(配置文件可在本问题末尾找到):

    ISessionFactory sessionFactory=new Configuration().BuildSessionFactory();
    ISession session=sessionFactory.OpenSession();
    IList<Customer> list=session.CreateCriteria<Customer>().List<Customer>();
    Assert.AreEqual(91, list.Count);
    

    问题是 list.Count 总是0。

    • 我试图通过提供自己的会话来打开会话。 IDbConnection 在SQL Server 2008上,MS Access和sqlite(我百分之百肯定数据库设置和连接有效)无效。
    • 我试图让生成的SQL显示在VS2008输出窗口上(请参阅本文底部的配置文件),但从来没有显示过。

    我只能在这个阶段猜测我的配置是错误的,但我不知道如何修复它。


    • App.CONFIG :

      <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
        <session-factory>
          <property name="dialect">NHibernate.Dialect.SQLiteDialect</property>
          <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
          <property name="connection.driver_class">NHibernate.Driver.SQLite20Driver</property>
          <property name="connection.connection_string">Data Source=S:\Work\SVN\src\Northwind\SQL\Northwind.db</property>
          <property name='proxyfactory.factory_class'>NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
          <property name="show_sql">true</property>
        </session-factory>
      </hibernate-configuration>
      <log4net>
        <appender name="DebugSQL" type="log4net.Appender.TraceAppender">
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
          </layout>
        </appender>
        <root>
          <level value="DEBUG" />
          <appender-ref ref="DebugSQL" />
        </root>
      </log4net>
      
    • 客户CS :

      namespace Northwind.DomainModel.NHibernate
      {
          public class Customer
          {
              public string CustomerID { get; set; }
              public string CompanyName { get; set; }
              public string ContactName { get; set; }
              public string ContactTitle { get; set; }
              public string Address { get; set; }
              public string City { get; set; }
              public string Region { get; set; }
              public string PostalCode { get; set; }
              public string Country { get; set; }
              public string Phone { get; set; }
              public string Fax { get; set; }
          }
      }
      
    • 客户.hbm.xml :

      <hibernate-mapping
        xmlns="urn:nhibernate-mapping-2.2"
        assembly="Northwind.DomainModel"
        namespace="Northwind.DomainModel.NHibernate"
      >
        <class name="Customer" table="Customers">
          <id name="CustomerID" column="CustomerID" type="String" length="5">
            <generator class="assigned" />
          </id>
          <property name="CompanyName" />
          <property name="ContactName" />
          <property name="ContactTitle" />
          <property name="Address" />
          <property name="City" />
          <property name="Region" />
          <property name="PostalCode" />
          <property name="Country" />
          <property name="Phone" />
          <property name="Fax" />
        </class>
      </hibernate-mapping> 
      
    3 回复  |  直到 15 年前
        1
  •  0
  •   Fen    15 年前

    我解决这个问题的第一步是询问您的调用正在生成什么SQL,然后尝试对目标数据库运行它,并查看您得到了什么结果

    您可能需要将附加器更改为控制台附加器,而不是跟踪。

        2
  •  0
  •   Emmanuel    15 年前

    在配置对象上调用configure需要两件事,如下所示:

       
    Configuration configuration = new Configuration().Configure();
    

    这要求在同一目录中有一个名为hibernate.cfg.xml的文件。如果您有其他名称,可以调用另一个方法来指定配置文件的名称。

    其次,您需要告诉nhibernate在何处加载映射文件,哪个程序集在创建工厂之前

    
    configuration.AddAssembly(typeof(Customer).Assembly); //if in same assembly with  customer class
    

    最后,客户类的所有成员都应该是虚拟的,否则就不能使用延迟加载。

        3
  •  0
  •   Community CDub    8 年前

    钉牢它!

    碰巧,我想巧妙地处理它,并将XML映射文件作为CS文件的依赖项。在这种情况下,嵌入的资源似乎带有包含在cs文件中的第一个类的名称,而不是XML文件的名称。一个被认为价值一千字的形象: Solution and Assembly

    所以我写这篇文章是为了让它发挥作用:

    ISessionFactory sessionFactory=new Configuration()
        .Configure()
        .AddResource(typeof(Customer).FullName, typeof(Customer).Assembly)
        .BuildSessionFactory();
    

    工作中的经验教训:

    • 当你试图使用一个没有已知映射的类时,nhibernate不会以任何方式抱怨。我不确定我会称之为功能…
    • 在和你自己的人开始谈话之前 IDbConnection ,打开连接本身。
    • 你学的东西比你想学的要多;-)