NHibernate.MappingException: Не требуется для: XYZ - программирование

NHibernate.MappingException: Не требуется для: XYZ

Теперь, прежде чем вы скажете: я сделал Google и мой 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

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

4b9b3361

Ответ 1

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

Если вы используете 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>
.
.

Ответ 2

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

Все файлы сопоставления XML должны рассматриваться как встроенные ресурсы, а не по умолчанию. Этот параметр устанавливается путем редактирования атрибута Build Action в свойствах файла.

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

Ответ 3

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

Ответ 4

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

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

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

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

class UserMap : ClassMap<user>

Ответ 5

Расходы около 4 часов на googling и stackoverflowing, пробовав все там, я нашел свою ошибку:

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

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

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

Ответ 9

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

Ответ 10

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

Ответ 11

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

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

Ответ 12

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

например.

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

Ответ 13

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

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

Ответ 14

У вас была аналогичная проблема при поиске объекта по id... Все, что я сделал, это использовать полное имя в имени класса. То есть Прежде чем это было:

find("Class",id)

Объект, чтобы он стал следующим:

find("assemblyName.Class",id)

Ответ 15

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