2010-12-03 2 views
8

Выполнение VS2003, nHB 3.0.0.3001, попытка запуска модульного теста через Gallio 3.2. Код начинается с первого сеанса «Лето nHibernate». При попытке выполнить тест я получаю следующую ошибку.nHibernate: Не удалось найти persister

NHibernate.HibernateException: Unable to locate persister: DataTransfer.Customer 
TargetSite: Void OnLoad(NHibernate.Event.LoadEvent, NHibernate.Event.LoadType) 
HelpLink: null 
at NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent event, LoadType loadType) 
at NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event, LoadType loadType) 
at NHibernate.Impl.SessionImpl.Get(String entityName, Object id) 
at NHibernate.Impl.SessionImpl.Get(Type entityClass, Object id) 
at NHibernate.Impl.SessionImpl.Get[T](Object id) 
at DataAccessLayer.NhibernateDataProvider.GetCustomerById(Int32 customerId) 

Мое очень необученное предположение заключается в том, что класс Customer не может быть замечен. Но как модульный тест, так и уровни доступа к данным имеют ссылку на сборку DataTransfer, которая содержит класс Customer. Класс Customer является общедоступным, и все свойства являются общедоступными.

Конфигурационный файл nHB находится в каталоге, а файл сопоставления клиентов является встроенным ресурсом. Кажется, сбой на линии :

return session.Get<Customer>(customerId); 

ответ

23
  1. Убедитесь, что файл отображения называется * .hbm.xml

  2. Убедитесь, что он установлен на внедренный ресурс.

  3. Если они не работают, отлаживаются и когда они терпят неудачу, поймайте исключение и посмотрите на InnerException. В NHibernate есть фантастические сообщения об ошибках.

Надежда эти thigs помочь - в противном случае мы можем рассмотреть некоторые другие варианты (но 1 и 2 решают 90% проблем) стойкая бактерия

+0

FYI - для пункт 2, посмотрите на свойства файла XML в студии, это верхний поле со списком (я считаю, что по умолчанию это Do not Copy, но у меня нет открытой Studio). – 2010-12-03 11:08:21

+2

Да, файл сопоставления был назван hbn.xml не hbm.xml спасибо за помощь. – 2010-12-05 02:15:12

0

Я использую ActiveRecord для отображения объекта, получил ту же ошибку когда пытались использовать ISession.Get, вместо того, чтобы использовать конфигурацию для получения сеанса, например:

     ISession session = new NHibernate.Cfg.Configuration() 
        .Configure() 
        .AddAssembly(typeof(Account).Assembly) 
        .SetInterceptor(new SqlStatementInterceptor()) 
        .BuildSessionFactory().OpenSession(); 

Я изменил его на работу через ActiveRecordMediator:

    ISession session = Castle.ActiveRecord.ActiveRecordMediator 
        .GetSessionFactoryHolder(). 
        CreateSession(typeof(Castle.ActiveRecord.ActiveRecordBase)); 

теперь его работает большой ..

0

В файле hibernate.cfg.xml, добавьте этот код:

В принципе, на ваш код его:

<mapping assembly="DataTransfer" /> 
Смежные вопросы