문제

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>
    
  • Customer.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; }
        }
    }
    
  • customer.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

못 박았다!

스마트를 재생하고 XML 매핑 파일을 CS 파일의 종속성으로 사용하고 싶었습니다. 이 경우 임베디드 리소스는 XML 파일의 이름 대신 CS 파일에 포함 된 첫 번째 클래스의 이름을 부담하는 것 같습니다. 천 단어의 가치가있는 이미지 :Solution and Assembly

그래서 나는 그것을 작동시키기 위해 이것을 썼습니다.

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

일을하는 데 배운 교훈 :

  • NHibernate는 알려진 매핑이없는 클래스를 사용하려고 할 때 어떤 식 으로든 불만을 제기하지 않습니다. 나는 그것을 그 기능이라고 부를 것인지 확신하지 못한다 ...
  • 자신의 세션을 열기 전에 IDbConnection, 연결 자체를 엽니 다.
  • 당신은 똑똑한 연주를 시도 할 때 의도했던 것보다 더 많은 것을 배웁니다 ;-)

다른 팁

문제를 해결하기위한 나의 첫 번째 단계 이것은 통화로 어떤 SQL이 생성되는지 묻고 대상 DB에 대해 실행하려고 시도하고 어떤 결과를 얻었는지 확인하는 것입니다.

Appender를 추적보다는 콘솔 appender로 변경해야 할 수도 있습니다.

다음과 같은 구성 객체에서 구성을 호출 해야하는 두 가지 사항입니다.

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

이것은 동일한 디렉토리에서 hibernate.cfg.xml이라는 파일을 기대합니다. 다른 이름이있는 경우, 구성 파일의 이름을 지정하기 위해 호출 할 수있는 다른 메소드가 있습니다.

둘째, Nhibernate를 알려주는 파일을로드 할 위치를 알려야합니다. 공장을 작성하기 전에 어셈블리


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

마지막으로 고객 클래스의 모든 구성원은 게으른로드를 사용할 수없는 가상이어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top