Вопрос

Теперь, прежде чем вы это скажете:я делал Гугл и мой hbm.xml файл является Встроенный ресурс.

Вот код, который я вызываю:

ISession session = GetCurrentSession();
var returnObject =  session.Get<T>(Id);

Вот мой файл сопоставления для класса:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="HQData.Objects.SubCategory, HQData" table="SubCategory" lazy="true">
    <id name="ID" column="ID" unsaved-value="0">
      <generator class="identity" />
    </id>

    <property name="Name" column="Name" />
    <property name="NumberOfBuckets" column="NumberOfBuckets"  />
    <property name="SearchCriteriaOne" column="SearchCriteriaOne" />

    <bag name="_Businesses" cascade="all">
      <key column="SubCategoryId"/>
      <one-to-many 
         class="HQData.Objects.Business, HQData"/>
    </bag>

    <bag name="_Buckets" cascade="all">
      <key column="SubCategoryId"/>
      <one-to-many
         class="HQData.Objects.Bucket, HQData"/>
    </bag>

  </class>
</hibernate-mapping>

Кто-нибудь сталкивался с этой проблемой раньше?

Вот полное сообщение об ошибке:

MappingException: No persister for:  HQData.Objects.SubCategory]NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName, Boolean throwIfNotFound)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionFactoryImpl.cs:766 NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionFactoryImpl.cs:752 NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent event, LoadType loadType)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Event\Default\DefaultLoadEventListener.cs:37 NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event, LoadType loadType)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionImpl.cs:2054 NHibernate.Impl.SessionImpl.Get(String entityName, Object id)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionImpl.cs:1029 NHibernate.Impl.SessionImpl.Get(Type entityClass, Object id)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionImpl.cs:1020 NHibernate.Impl.SessionImpl.Get(Object id)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionImpl.cs:985 HQData.DataAccessUtils.NHibernateObjectHelper.LoadDataObject(Int32 Id)
 in C:\Development\HQChannelRepo\HQ Channel Application\HQChannel\HQData\DataAccessUtils\NHibernateObjectHelper.cs:42 HQWebsite.LocalSearch.get_subCategory()
 in C:\Development\HQChannelRepo\HQ Channel Application\HQChannel\HQWebsite\LocalSearch.aspx.cs:17 HQWebsite.LocalSearch.Page_Load(Object sender, EventArgs e)
 in C:\Development\HQChannelRepo\HQ Channel Application\HQChannel\HQWebsite\LocalSearch.aspx.cs:27 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +33 System.Web.UI.Control.OnLoad(EventArgs e) +99 System.Web.UI.Control.LoadRecursive() +47 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436

Обновлять, вот какое решение для мой сценарий был:Я изменил некоторый код и не добавлял сборку в файл конфигурации во время выполнения.

Это было полезно?

Решение

Похоже, вы забыли добавить сборку сопоставления в конфигурацию фабрики сеансов.

Если вы используете app.config...

.
.
    <property name="show_sql">true</property>
    <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
    <mapping assembly="Project.DomainModel"/>  <!-- Here -->
</session-factory>
.
.

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

Что-то очевидное, но весьма полезное для новичков в NHibernate.

Все файлы сопоставления XML следует рассматривать как Встроенные ресурсы а не по умолчанию Содержание.Этот параметр задается путем редактирования атрибута «Действие сборки» в свойствах файла.

XML-файлы затем встраиваются в сборку и анализируются при запуске проекта на этапе настройки NHibernate.

Моя проблема заключалась в том, что я забыл указать .hbm в имени XML-файла сопоставления.Также убедитесь, что вы сделали его встроенным ресурсом!

Я получил это от здесь:

В моем случае класс сопоставления не был общедоступным.Другими словами, вместо:

public class UserMap : ClassMap<user>  // note the public!

У меня только что был:

class UserMap : ClassMap<user>

Потратив около 4 часов на гуглить и переполнение стека, перепробовав все, что там есть, я нашел свою ошибку:

Мой файл сопоставления назывался .nbm.xml вместо .hbm.xml.Это было безумие.

У меня была аналогичная проблема, и я решил ее следующим образом:

Я работаю над MS SQL 2008, но в конфигурации NH у меня был плохой диалект:NHibernate.Диалект.MsSql2005Диалектесли я исправлю это на:NHibernate.Диалект.MsSql2008Диалекттогда все работает нормально без исключения "Нет персистера для:..." Дэйвид.

Я также добавлял неправильную сборку во время инициализации.Класс, который я сохраняю, находится в сборке №1, а мой файл .hbm.xml встроен в сборку №2.Я изменился cfg.AddAssembly(... добавить сборку №2 (вместо сборки №1) и все заработало.Спасибо!

Чтобы добавить к ответу Амола, не делайте ошибку, указывая тип класса интерфейса. Обязательно укажите класс реализации.(То есть.не используйте IDomainObjectType).Не то чтобы я совершил эту ошибку...:)

Должно ли это быть name="Id"?Опечатки являются вероятной причиной.

Далее следует опробовать это с помощью необщего теста, чтобы убедиться, что вы передаете правильный параметр типа.

Можете ли вы опубликовать полное сообщение об ошибке?

У меня была та же проблема, потому что я добавлял неправильную сборку в методе Configuration.AddAssembly().

Эта ошибка возникает из-за неправильной конфигурации сопоставления.Вам следует проверить, где вы установили .Mappings для своей фабрики сеансов.В основном найдите «.Mappings(» в своем проекте и убедитесь, что вы указали правильный класс сущности в строке ниже.

.Mappings(m => m.FluentMappings.AddFromAssemblyOf<YourEntityClassName>())

Если вы запускаете тесты в репозитории из отдельной сборки, убедитесь, что ваш Hibernate.cfg.xml настроен на вывод всегда в каталоге bin указанной сборки.У нас этого не происходило, и при определенных обстоятельствах мы получали вышеуказанную ошибку.

Отказ от ответственности:Это может быть несколько эзотерический совет, учитывая, что он является прямым результатом того, как мы структурируем наши тестовые сборки интеграции репозитория (т.у нас есть символическая ссылка от каждой тестовой сборки на один Hibernate.xfg.xml)

Не забудьте указать информацию о сопоставлении в файле .config.

например

где MyApp.Data — это сборка, содержащая ваши сопоставления.

Была аналогичная проблема при поиске объекта по идентификатору...Все, что я сделал, это использовал полное имя в имени класса.Это до того, как это было:

find("Class",id)

Объект, чтобы стало так:

find("assemblyName.Class",id)

Убедитесь, что вы позвонили в CreateCriteria(typeof(DomainObjectType)) метод сеанса для объекта домена, который вы собираетесь получить из БД.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top