Проблема при сопоставлении клиента Northwind с NHibernate

StackOverflow https://stackoverflow.com/questions/1464574

Вопрос

Будучи новичком в 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 (я на 100% уверен, что настройки базы данных и соединения верны) безрезультатно.
  • Я пытался отобразить сгенерированный 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

Успешно справился !

Бывает, что я хотел действовать умно и использовать файл сопоставления XML в качестве зависимости от файла CS.В этом случае встроенный ресурс будет носить имя первого класса, содержащегося в CS-файле, а не имя XML-файла.Изображение, предположительно, стоит тысячи слов:Solution and Assembly

Поэтому я написал это, чтобы заставить его работать:

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

Уроки, извлеченные для того, чтобы заставить его работать:

  • NHibernate не будет жаловаться, когда вы попытаетесь использовать класс без известного сопоставления.Не уверен, что я бы назвал это особенностью...
  • Прежде чем открыть сеанс самостоятельно IDbConnection, откройте само соединение.
  • Пытаясь играть умно, вы узнаете больше, чем намеревались ;-)

Другие советы

Моим первым шагом к устранению неполадок было бы спросить, какой sql генерируется вашим вызовом, а затем попытаться запустить его с целевой базой данных и посмотреть, какие результаты вы получите.

Возможно, вам придется изменить приложение на консольное, а не на трассировку.

две вещи, которые вам нужно вызвать configure для вашего объекта конфигурации, например:

   
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