nHibernate: не удается найти persister

запуск VS2003, nHB 3.0.0.3001, попытка запустить модульный тест через Gallio 3.2. Код от первой сессии "лето NHibernate на". Я получаю следующую ошибку при попытке запустить тест.

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);

3 ответов


  1. убедитесь, что файл сопоставления имеет имя *.hbm.в XML

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

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

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


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

                     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));

теперь его работа велика..


на вашем спящем режиме.контекстно-свободная грамматика.xml-файл, добавьте этот код:

 <mapping assembly="(name of your Assembly Project)" />

в основном, на вашем коде его:

 <mapping assembly="DataTransfer" />