Проблема при сопоставлении клиента Northwind с NHibernate
-
13-09-2019 - |
Вопрос
Будучи новичком в 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-файла.Изображение, предположительно, стоит тысячи слов:
Поэтому я написал это, чтобы заставить его работать:
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
Наконец, все члены вашего класса клиентов должны быть виртуальными, иначе вы не сможете использовать отложенную загрузку.